2016-06-28 4 views
2

Некоторые URL-адреса PHP загружаются, а не выполняются Nginx. У меня есть существующее веб-приложение, которое работает нормально. Мне поручено добавлять дополнительные смонтированные приложения в папки основного приложения. Каждое из этих приложений имеет свой собственный контроллер фронтального контроллера index.php.nginx, обслуживающий некоторые URL-адреса PHP, вместо загрузки

Для этой настройки я создал символические ссылки внутри $document_root/app, а символические ссылки указывают на папку, содержащую передний контроллер index.php.

Когда я перехожу к большинству URL-адресов, все работает нормально, основной контроллер фронтального приложения выполнен, и я получаю ожидаемые результаты. Когда я перехожу к несуществующему приложению, я получаю 404 Not Found от nginx, что ожидается. Но когда я перехожу к одному из приложений, браузер загружает внешний контроллер приложения.

root     /my/web/root; 

location/{ 
    try_files   $uri 
         /$server_name$uri 
         /shared$uri 
         /index.php$is_args$args; 
} 

location ~ [^/]\.php(/|$) { 
    disable_symlinks off; 
    fastcgi_split_path_info ^(.+\.php\b)(.*)$; 
    fastcgi_param  SERVER_NAME $host; 
    fastcgi_param  PATH_INFO $fastcgi_path_info; 
    fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name; 
    fastcgi_param  SCRIPT_NAME /index.php; 
    fastcgi_index  index.php; 
    include    fastcgi.conf; 
    fastcgi_pass  php-fpm; 
} 

location ~ ^/app/([a-z-]+)(/.*)?$ { 
    try_files   $uri 
         /app/$1/index.php$is_args$args 
         =404; 
} 

URL, который запускает скачать:/app/my-app/(существует)
URL, который ошибки 404:/app/foo/(не существует)
URL, который выполняет:/foo

+0

Постарайтесь установить местоположение для php в 'location ~ [^ /] \. Php (/ | $)' –

+0

Тот же результат .... –

ответ

2

.php файл должен быть обработан location ~ [^/]\.php(/|$) блок. У вас есть общий корень документа, который упрощает работу.

Однако look at this document относительно директивы location.

Вы увидите, что местоположения регулярных выражений считаются для заказа, и первое соответствующее местоположение будет использовано для обработки запроса.

Короче говоря, вам нужно поместить location ~ [^/]\.php(/|$) блок перед тем любого другого противоречивого расположения регулярных выражений, если вы хотите, чтобы ваши .php файлы, которые будут обработаны правильно.

+0

Без изменений в поведении. Явный URL-адрес '.../app/index.php' выполняется, неявные' .../app/'загрузки URL-адресов, а не URL-адреса приложений. –

+3

У вас есть ошибка в вашей последней директиве 'try_files'. Удалите '= 404'. Элемент '/ app/$ 1/index.php $ is_args $ args' должен быть последним в строке. Подробнее см. [Этот документ] (http://nginx.org/en/docs/http/ngx_http_core_module.html#try_files). –

+1

Подробнее о том, почему '= 404' ломает вещи: [try_files] (http://nginx.org/en/docs/http/ngx_http_core_module.html#try_files) служит« первым найденным файлом »из его списка» в текущем контексте ». Для '/ app/my-app' этот контекст представляет собой блок' location ~ ^/app/([az -] +) (/.*)? $ ', Который не обрабатывает PHP, поэтому nginx отправляет исходный файл raw '/ app/my-app/index.php'. Однако последний элемент в списке try_files * перенаправлен * на. Когда '/ app/$ 1/index.php' является последним, он перенаправляется в блок' location ~ [^ /] \. Php (/ | S) ', который обрабатывает PHP, поэтому после удаления' = 404' запускается контроллер my-app. –

Смежные вопросы