Это связано с старый вопрос, который я задал на 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?
Если является зло, но как в документации говорится, это нормально для 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
обрабатываются в правильном месте.