Назад | Перейти на главную страницу

Nginx не передает запрос PHP

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