nginx переписать на основе части URL

Я пытаюсь настроить nginx переписывает; Я успешно настроил его для удаления расширения:

https://example.com/accounts?id=user-123 указывает на https://example.com/accounts.php?id=user-123 используя просто try_files:

location / { try_files $uri $uri/ $uri.html $uri.php?$args; }

Я хочу настроить второе переписывание, которое идет до этого; все идентификаторы пользователей начинаются с user-, так example.com/user-sdgas3 следует переписать на example.com/accounts?id=user-sdgas3, example.com/faq-abc8989as следует переписать на example.com/faqpage?id=faq-abc8989as, example.com/faq-abc8989as?view=true идет к example.com/faqpage?id=faq-abc8989as&view=true и т.п.

То, что я пробовал, это просто добавление вариантов в самом начале для каждого расширения URL:

location ^/faq-(*)$ { try_files $faqpage?id=$1; }

без удачи Как это можно сделать?

1 ответ

Решение

Вам, очевидно, не нужно настраивать цепочку переписываний (что похоже на то, что вы пытаетесь). Это был бы неправильный способ сделать вещи:

/user-123 -> /accounts?id=user-123 -> /accounts.php?id=user-123

... потому что, очевидно, вы можете / должны переписать непосредственно в файл обработчика PHP:

/user-123 -> /accounts.php?id=user-123

Похоже, у вас нет одного маршрутизатора точки входа PHP (стандартный подход). Если у вас было это, то try_files было бы достаточно. Но потому что у вас есть много .php файлы обработчиков, вам придется использовать rewrite для них.

Таким образом:

rewrite ^/user-(.*) /accounts.php?id=user-$1 last;
rewrite ^/faq-(.*) /faq.php?id=$1 last;

# This is only needed if /index.php can handle /this or /that route
location / {
    try_files $uri $uri /index.php$is_args$args;
} 

location \.php$ {
    ... the usual stuff for PHP-FPM
}
Другие вопросы по тегам