Это связано с старым вопросом, который я задал на SO лет назад, на который я так и не получил правильного ответа. Я просто настраиваю новый сервер (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?
Если является злом, но как указано в документации , допустимо переписывать ... последние утверждения.
Однако, альтернативный подход (который все еще извлекает лишь часть $uri
) заключается в использовании именованного местоположения в конце утверждения try_files
:
location /qa/ {
try_files $uri $uri/ @qa;
}
location @qa {
rewrite ^/qa/(.*)$ /qa/index.php?qa-rewrite=$1 last;
}
Подход к определению местоположения регекса также является правомерным. Однако определение местоположения реджексов оценивается по-другому в префиксные местоположения. Необходимо разместить блок ~ \.php$
блока выше блока ~ ^/qa/(.*)
, чтобы URI, заканчивающиеся на .php
, обрабатывались в правильном месте.