nginx обрабатывает только один блок местоположения на каждом уровне вложенности, поэтому /login.php
является обрабатывается блоком ^ ~ / login
, а не блоком ~ \ .php $
. Поскольку у вас есть только операторы перезаписи в ваших блоках местоположения, вам фактически не нужны блоки местоположения (при условии, что совпадения перезаписи достаточно конкретны, каковы ваши). Просто переместите свои операторы перезаписи в корень блока server
, чтобы запросы / login
и / admin
по-прежнему использовали \. Php $
блок местоположения:
rewrite ^/$ /index.php last;
rewrite ^(/login)$ $1/ permanent;
rewrite ^/login/$ /login.php last;
rewrite ^/login/(.+\.php)$ /$1 last;
rewrite ^(/admin)$ $1/ permanent;
rewrite ^/admin/$ /page_builder.php last;
rewrite ^/admin/(.+\.php)$ /$1 last;
location ~ \.php$ {
...
}
Ответ mgorven решил мою проблему, и я так благодарен, что хотел ответить, но у меня нет представителя, чтобы просто прокомментировать, поэтому я собираюсь ответить здесь с обновлением, что, хотя это было задано и ответило 8 лет назад здесь, в 2021 году, я бился головой об эту проблему в течение нескольких дней
У меня был экземпляр Wordpress, который был скрыт / защищен аддоном HideMyWordPress - у меня был портировал экземпляр с другого сервера, который был apache2 и безупречно работал с переписыванием apache - но я новичок в nginx - очень полезный ответ mgorven не только решил мою проблему, но и действительно объяснил то, что я полностью пропустил во всех моих раскопках. о блокировках местоположения против переписывания - Я сейчас просматриваю все свои сайты, которые я переместил, чтобы посмотреть, смогу ли я значительно упростить свои конфигурации nginx
Снова извините за ответ с «ответом» вместо комментария, но
Даже в 2021 году это чертовски полезная информация и сохранила мой бекон
СПАСИБО