将mod_rewrite规则转换为nginx配置 - 意外下载而不是重写

时间:2017-01-03 00:09:07

标签: php apache .htaccess mod-rewrite nginx

我正在搞乱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}}。除了让服务器首先听到正确的端口之外,还有什么方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

如果您的PHP文件被下载,它基本上表明* .php位置在这种情况下不匹配。那么为什么不是?

rewrite ... break规则告诉nginx停止处理当前的重写规则集,但控件仍保留在当前位置块内。这不是你想要的:你真的希望nginx根据你计算的新uri重新评估位置。

尝试用break替换last关键字。这将告诉nginx它必须开始新一轮,搜索修改后的uri。

<强>更新

在继续之前,请尝试这个非常简单的配置:

location / {
    try_files   $uri $uri/ /index.php;
}