Назад | Перейти на главную страницу

nginx переписывает URL-адрес на основе подстроки

У меня есть скрипт 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