我想将 PHP 应用程序从 Apache 迁移到 Nginx。问题是应用程序崩溃了,因为路由不再起作用,而且我不太清楚如何修复它。
PHP 应用程序包含一些 .htaccess 文件,我尝试将它们转换为 Nginx。
第一个在文档根目录中:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^$ public/ [L]
RewriteRule (.*) public/$1 [L]
</IfModule>
第二个在 /public/
<IfModule mod_rewrite.c
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Rewrite all other URLs to index.php/URL
RewriteRule ^(.*)$ index.php?url=$1 [PT,L]
</IfModule>
<IfModule !mod_rewrite.c>
ErrorDocument 404 index.php
</IfModule>
第三个也是最后一个是:
deny from all
我的 nginx 版本如下所示:
#用户没人; 工作进程 1; #pid 日志/nginx.pid; 事件 { 工作者连接1024; } http { 包括 mime.types; 默认类型应用程序/八位字节流; 发送文件; #tcp_nopush 开启; 保持活动超时 65; 开启 gzip; 服务器 { 听 8080; 服务器名称本地主机; 根/图书馆/ Web服务器/文档/管理员; 地点 / { 索引索引.php; 重写 ^/$ /public/break; 重写 ^(.*)$ /public/$1 中断; } 位置/公共{ 如果(!-e $ request_filename){ 重写^(.*)$ /index.php?url=$1 中断; } } 位置 /图书馆 { 全部否认; } #错误页面 404 /404.html; # 将服务器错误页面重定向到静态页面/50x.html # 错误页面 500 502 503 504 /50x.html; 位置 = /50x.html { 根html; } 位置 ~ \.php$ { 根/图书馆/ Web服务器/文档/管理员; fastcgi_pass 127.0.0.1:9000; fastcgi_index索引.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 包括 fastcgi_params; } } }
我遇到的问题是路由出现问题,只返回 404 页面。希望有人有想法并知道如何修复它 ;)
谢谢
编辑
我使用这个配置让它工作
位置 /图书馆 { 全部否认; } 位置 ~* ^.+.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js)$ { 访问登录关闭; 重写 ^(.*)$ /public/$1 中断; } 地点 / { 重写 ^/(.+)$ /index.php?url=$1 最后; }
我相信有更好的解决方案,并且我愿意接受建议。
答案1
看起来好像您有一个路由循环。
您正在引导所有来自 的流量/
到/public
,然后引导所有来自 的流量/public
到/index.php
根据 /public/.htaccess,所有对 /public 的请求都应路由到,/public/index.php?url=$1
而不是/index.php?url=$1
location /public {
if (!-e $request_filename){
rewrite ^(.*)$ /public/index.php?url=$1 break;
}
}