Nginx 未将请求传递给 PHP

Nginx 未将请求传递给 PHP

这与我之前问过的一个老问题年前,我从未得到过正确的答案。我刚刚设置了一个新服务器(Ubuntu 16.04、Nginx 1.10、PHP 7),然后又回到了这个问题。

我在子文件夹中运行 Question2Answer 实例,其他 PHP 代码则从根目录运行。对于根目录,我的服务器块中有以下内容:

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

location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/run/php/php7.0-fpm.sock;
}

对于 Q2A,我在旧服务器上有:

location /qa/ {
    if (!-e $request_filename) {
        rewrite ^/qa/(.*)$ /qa/index.php?qa-rewrite=$1 last;
    }
}

这确实有效,但我不认为这是应该做的(如果是邪恶的,等等)。我确信只使用 就一定有可能try_files。我试过这个:

location /qa/ {
    try_files $uri $uri/ /qa/index.php?qa-rewrite=$uri&$args;
}

但它不起作用,因为/qa/传入了qa-rewrite。它应该只是在路径中传递后面的所有内容。有没有办法/qa/$uri变量中删除?

我也尝试过这个:

location ~ ^/qa/(.*) {
    try_files $uri $uri/ /qa/index.php?qa-rewrite=$1;
}

但这反而会开始下载 PHP 代码index.php!我该如何将其传递给 PHP 引擎?

答案1

如果邪恶,但作为文档指出,对于语句来说就可以了rewrite ... last

但是,另一种方法(仍然只提取一部分$uri)是在语句末尾使用命名位置try_files

location /qa/ {
    try_files $uri $uri/ @qa;
}
location @qa {
    rewrite ^/qa/(.*)$ /qa/index.php?qa-rewrite=$1 last;
}

正则表达式定位方法也有效。但正则表达式定位评价不同前缀位置。你需要放置location ~ \.php$多于location ~ ^/qa/(.*),以便以 结尾的 URI.php在正确的位置进行处理。

相关内容