这与我之前问过的一个老问题年前,我从未得到过正确的答案。我刚刚设置了一个新服务器(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
在正确的位置进行处理。