我正在搞乱nginx并尝试将mod_rewrite规则转换为nginx。到目前为止,我一直在使用以下内容:
RewriteEngine On
RewriteBase /
ErrorDocument 403 /HttpUnauthorized
ErrorDocument 404 /HttpNotFound
# Remove Trailing Slashes
RewriteCond %{REQUEST_METHOD} !=POST [NC]
RewriteCond %{REQUEST_URI} /$ [NC]
RewriteCond %{REQUEST_FILENAME} !-f [NC]
RewriteCond %{REQUEST_FILENAME} !-d [NC]
RewriteRule ^(.+)/$ $1 [NC,R=301,L]
# Removes index.php from URLs (actually this happens everywhere!)
RewriteCond %{THE_REQUEST} ^GET.*index\.php [NC]
RewriteRule (.*?)index\.php/*(.*) $1$2 [R=301,NE,L]
# Directs all web requests through the site index file
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?q=/$1 [L,QSA]
我在网上找到的工具提出了以下输出:
error_page 404 /HttpNotFound;
error_page 403 /HttpUnauthorized;
location / {
if ($request_method != "POST") {
rewrite ^/(.+)/$ /$1 redirect;
}
rewrite (.*?)index\.php/*(.*) /$1$2 redirect;
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?q=/$1 break;
}
}
并且(也许这也很重要)PHP我正在使用此调用:
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass php-fpm:9000;
fastcgi_param SCRIPT_FILENAME /var/www/html/$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_index index.php;
include fastcgi_params;
}
请求http://localhost/Foo
实际上是在下载原始index.php
源文件,但是请求http://localhost/index.php?q=/Foo
正确地使用预期输出打开浏览器中的相应站点。我的配置实际上有什么问题?
因为事实证明该工具的规则非常糟糕,所以我从一个基本的
开始location / {
try_files $uri $uri/ /index.php;
}
现在可以使用$_REQUEST['q']
读取我以前通过$_SERVER['REQUEST_URI']
获取的查询字符串。所以我尝试使用
rewrite ^/(.+)/$ /$1 permanent;
不幸的是,这两者都有效,并且在我的特定设置中同时无效。我在Docker容器中运行nginx,因此服务器在端口8082上暴露时在内部侦听端口80.由于nginx认为它在端口80上运行(即使我通过http://localhost:8082/Foo/
请求),它会重写为{ {1}}。除了让服务器首先听到正确的端口之外,还有什么方法可以解决这个问题吗?
答案 0 :(得分:1)
如果您的PHP文件被下载,它基本上表明* .php位置在这种情况下不匹配。那么为什么不是?
rewrite ... break
规则告诉nginx停止处理当前的重写规则集,但控件仍保留在当前位置块内。这不是你想要的:你真的希望nginx根据你计算的新uri重新评估位置。
尝试用break
替换last
关键字。这将告诉nginx它必须开始新一轮,搜索修改后的uri。
<强>更新强>
在继续之前,请尝试这个非常简单的配置:
location / {
try_files $uri $uri/ /index.php;
}