В каких случаях может не сработать regex «[^/]\.php(/|$)»?
Привет,
Я не очень силен в regex, но чуток посмотрел по операторам, но все таки не могу въехать...
Вообщем конфиг nginx, сайт с первым работает нормально (лишних / нет в адресе), но как только я меняю на 2й вариант, редиректит не туда куда надо. Подскажите, в каких случаях не сработает 2й вариант?
1-й вариант location ~ \.php$ {
2-й вариант location ~ [^/]\.php(/|$) {
И вообще какой из вариантов предпочтительней, на nginx сайте в конфигах пишут 2й вариант, а если пробежаться по github-у то гораздо чаще упоминается первый.
Разберем [^/]\.php(/|$) [^/]- начало строки НЕ начинается со / ( тут коллега был не прав это именно отрицание символа) \.php - экранирование точки то есть точка это как точка а не любой символ. ТО есть .php должно быть в урле (/|$) -или или вертикальная черта разделитель соответственно оканчивается или на / или просто без него.
Но я бы всеже сделал более правильное выражение посколкьу регулярка подойдет и к такому урлу /.php/
А это совсем не тру, хотя и имеет место жить.
Как минимум я бы остановился на
[^/].+\.php(/|$) .+- Как минимум 1 знак или символ там должен быть
В результате регурярка имела бы значение следующее.
/x.php/
Но и это не все
файл со слешем не бывает, и это не правильно так что [^/].+\.php&- тут будет соответствие тольок x.php что на мой взгляд более правильно.
Я действительно допустил ошибку с [^/] перепутав с ^[/]
Но кстати, url domain.tld/index.php/jhkjhkj в него сматчится, например, как и /index.php.
[^/] это любой символ кроме /, и не обязательно в первой позиции.
Вообще, это довольно бесполезный кусок выражения в данном месте.
Файл со слешём, не бывает, но бывает что-то типа index.php/что-нибудьещё, и есть случаи, когда это обрабатывается в этом локейшене.
Например, в drupal 8 update.php/selection - рекомендованный локейшен при этом
location ~ \.php(/|$) и fastcgi_split_path_info ^(.+?\.php)(|/.*)$ в нём.
Т.е. ваш последний локейшен работать не будет правильно.
Ещё раз: эти локейшены просто для разных случаев, и не эквивалентны. Ни один из них не является более правильным в общем виде.
Борис Сёмов, index.php/ - ну если гет запросы
Но в таком случае это index.php?ID=4344...
как мы видим тут нет слеша, так что сомнительно вообще. [^/] - как правило целесобразно использовать с жадными квантификаторами -например не 4 слеш в урле.
Что же касается ЧПУ - а это явно оно - оно должно иметь первоначальный приоритет и стоять выше остальных, но опять же работает, то и смысл дергать нет.
Виктор Таран, Ничего не понял.
index.php?ID=4344 - этого не будет в $uri, который обрабатывается локейшеном вообще - ID=4344 будет в $query_string же.
Есть случаи, когда есть смесь ЧПУ( /cat/subcat) и нотации вида file.php/something, или вообще второй вариант. И тогда, вариант ЧПУ обрабатывается каким-то другим локейшеном, а file.php/something этим.
Я привёл пример выше же с Drupal8. Там только пара служебных скриптов на самом деле требуют этого ~ \.php(/|$)
В общем, мой начальный ответ верен, за исключением слов "должен начинаться со слеша".
Борис Сёмов, Не ну если урлы такие ээээ "странные" то да конечно нужен, но тут уже косяк разработчиков движка.
А гет я и показал что слеш ненуен.
был случай в моей практике когда локейшен не работал вот с таким правилом.
Борис Сёмов, Ага экрана нет, вот только на сервере 600 сайтов было на хрен пойми каком количестве движков и все работало
А этот сцуко сайт тоже раобтал, толко единственная страничка умирала.
Локейшен статики как-то не сразу на ум вылез.
О столько интересного в ответах :)
Движок используется opencart, так что возможно кто-то уже сталкивался.
Вот я сейчас поэкспериментировал... редирект срабатывает не туда куда надо если использовать [^/].+\.php(/|$) сразу после установки.
Если например я установлю с ~ \.php$ и потом перейду на сайт и уже потом поменяю на [^/].+\.php(/|$) то все работает...
В общем я так понимаю после установки там идет какой то uri не совпадающий по правилам с [^/].+\.php(/|$)
Reckful, не, у тебя просто кеш редиректов ;)
google.com -> как отключить кеш редиректов в хроме
Для проверки кода ответа сервера лучше использовать сервисы которые отдают не последний код а всю очередь https://bertal.ru/index.php?a4459256
Тогда будет понятно что и где встает.
~ \.php$
в принципе тоже пойдет но тогда должно пойти и ~ \.php$(/|$)
Есть конечно вариант что нужн оэкранировать спецсимволы но это не баш, вроде должно нормально работать, это там приходетя изголяться ~ \.php$\(/\|$\)
Это не эквивалентные варианты. Как можно сказать, какой предпочтительнее? Выбирайте тот, что нужен именно вам.
Первый вариант сработает на все uri, которые заканчиваются на .php
Во втором uri должен начинаться со слеша, и заканчиваться на .php или .php/всё что угодно.