У меня есть скрипт php, который полагается на чтение URL-адреса для выполнения необходимых действий, поэтому мне нужно перенаправить пользователей, приходящих на
example.com/pl/[User-id-or-name]
к example.com/pl.php/[User-id-or-name]
Я делал это с помощью простого правила .htaccess
Options +FollowSymLinks +MultiViews
RewriteRule ^pl/?$ lp.php [NC]
И попытался сделать то же самое в nginx, используя
location ^//pl//?$ {
rewrite ^//pl//?$ /pl.php;
}
Это вроде работает, если я пойду в mydomain.com/pl/
Затем он показывает мне pl.php
файл в порядке, но если я добавлю идентификатор пользователя или имя, он перенаправит меня в Wordpress "Страница не найдена" страница.
Что я делаю не так?
Вот как я решил проблему
rewrite ^/pl/(.*)$ /pl.php?user=$1 last;
Да, только одно простое правило, полученное от
https://www.nginx.com/blog/creating-nginx-rewrite-rules/
Почему две косые черты вместо одной? Кроме того, вы используете синтаксис regexp в non-regexp-location, поэтому он «вроде как» работает. Наконец, вам не хватает перезаписи виртуальных путей.
Учитывая все вышесказанное, я бы попробовал использовать следующий блок местоположения:
location / {
if (!-e $request_filename) {
rewrite ^/(.*)$ /pl.php;
}
}
Во-первых, двойные слэши не нужны. Регулярное выражение ^/pl/?$
будет соответствовать только /pl
и /pl/
.
Вы можете исправить это, просто исправив выражение в location
и исправление rewrite
.
location ~ ^/pl(/.*)$ {
rewrite ^/pl(/.*)$ /pl.php$1 break;
return 403;
}
Лучшая альтернатива, требующая меньшей конфигурации, - поместить перезапись в server
блок.
server {
[...]
rewrite ^/pl(/.*)$ /pl.php$1 last;
[...]
}
Видеть: https://nginx.org/en/docs/http/ngx_http_rewrite_module.html