Задать вопрос

Регулярное выражение в location nginx?

Добрый вечер, уже 2 3 дня бьюсь над проблемой,
location ~* ^/.+\.(php)$ { — регулярное выражение из конфига nginx, которое нам говорит, что если запрашиваемый файл *.php, то этот location исполняется.


Передо мною стоит задача: сделать location исключающий php. То есть если в запросе НЕ php, то location обрабатывается.


Вариант ~* .+(!?php)$ у nginx не проходит (он упорно продолжает запрашивать статику с апача, видимо regexp там особенный..). ~* — в nginx означает без учета регистра.


Есть вариант ~* ^(.+?)[^/.php]$, но он не отрабатывает человеческие ссылки вида/link2/link3, но отрабатывает/link2/link3/ (в конце стоит слеш). И приходится переопределять в других location файлы .h, .p, .ph, .hp, .*ph и .*php.


Помогите пожалуйста создать верный location и направить мой nginx на истинный путь.


Если вариант все в 1 не реализуем, то какие 2 location создать, учитывая специфику nginx?


nginx с оффсайта, скачаны исходники, сконфигурированы под нужны и make && make install.
submodsubstitutions4nginx мод из этого топика.

nginx -V
nginx version: nginx/0.8.54<br/>
built by gcc 4.4.5 (Debian 4.4.5-8)<br/>
TLS SNI support enabled<br/>
configure arguments: --with-http_ssl_module --with-pcre --with-http_dav_module --with-http_realip_module --with-http_stub_status_module --with-http_sub_module --with-http_addition_module --add-module=/usr/udata/nginx-0.8.54/submod
  • Вопрос задан
  • 22942 просмотра
Подписаться 4 Оценить 4 комментария
Пригласить эксперта
Ответы на вопрос 4
iSage
@iSage
Если я правильно понял, что вы хотите, то вот: отдавать все, что не php напрямую.
server {
    ...
    index index.php;
    ...
    location ~ ^.*\.php
    {
        ...
    }
    root /path/to/your/static/files/;
}
Ответ написан
frol
@frol
Линуксоид
Решение 1. Я конечно понимаю, что на php любят сваливать исходники и статику в одну кучу, но советую просто вынести всю статику в одну папку /static/ и будете через nginx спокойно отдавать все урлы, начинающиеся со /static/ как статику, а остальное — на php.
Решение 2. В nginx локейшины с regexp выполняются последовательно, поэтому можно написать:
location ~* \.php$ {

}
location ~ ^ {
root /project/;
}
Всё, что не пройдёт по первому условию пойдёт дальше.
Ответ написан
@niakrisn
Если задача в том, чтобы php отправить на backend, а статику отдать с диска, то поможет try_files:

location / {
try_files $uri $uri/ @php;
}

location @php {
...
}
Ответ написан
iSage
@iSage

location / {
    try_files $uri $uri/ /index.php?q=$request_uri;
}

wiki.nginx.org/Joomla
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы