Символ тире или переноса в NGINX

T
На сайте с 25.04.2004
Offline
168
529
Есть сайт который содержит в ссылках символы тире типа такого:
site.com/link/my1-link
Нужно, чтобы параметр my1-link перенаправлялся на site.com/base/main.php?name=my1-link и там обрабатывался.
Если делать перенаправление на Apache, то регулярка в конфиге работает без проблем:
RewriteRule "^link/([a-z0-9'+\w-]+)" "base/main.php?name=$1" [L,QSA]

А вот nginx дефис(-) не воспринимает вообще. Пробовал обозначать дефис в конфиге регуляркой разными вариантами: \x2d - \- \w-. Отдельно каждый вариант или все вместе. А Apache любой вариант работает, а в nginx с тире никакой. GET в PHP получает обрезанный параметр my1 без дефиса и всего остального.
location / {
rewrite ^link/([a-z0-9+'\w-]+) /base/main.php?name=$1 break;
Можно как-нибудь решить эту проблему?

damn-doubleclick
На сайте с 10.09.2021
Offline
47
#1

В NGINX правило перезаписи URL-адресов записывается с использованием директивы "rewrite". Аналогичное правило для NGINX, эквивалентное вашему примеру для Apache с использованием RewriteRule, будет выглядеть следующим образом:

rewrite "^/link/([a-z0-9'+\w-]+)" /base/main.php?name=$1 last;

  1. Убедитесь, что правило находится в правильном месте в конфигурационном файле. Правила перезаписи в NGINX обрабатываются в порядке, указанном в конфигурационном файле. Если правило находится в неправильном месте, то оно может быть неприменимым или перезаписать URL-адрес неправильно.

  2. Проверьте, что регулярное выражение правильно соответствует URL-адресу. Если регулярное выражение не соответствует URL-адресу, то правило перезаписи не будет применено.

  3. Убедитесь, что правило перезаписи имеет правильный синтаксис. Если правило содержит синтаксические ошибки, то оно не будет применено.

  4. Проверьте, что запрос находится в нужном контексте. Некоторые директивы в NGINX, такие как location, server, if, имеют свой контекст и определенные условия, при которых запрос может быть обработан правильно.

Если вы не можете найти причину проблемы, то можно попробовать добавить директиву "rewrite_log on" в конфигурационный файл. Она позволит записывать в логи информацию о перезаписи URL-адресов и может помочь выявить ошибки в правилах.

***

Для включения логирования перезаписи URL-адресов в NGINX необходимо добавить директиву rewrite_log on; в раздел http в конфигурационном файле сервера.

Например, чтобы включить логирование перезаписи в файл /var/log/nginx/rewrite.log , можно добавить следующую строку в конфигурационный файл NGINX:

http {

  ...

  rewrite_log on;

  error_log /var/log/nginx/error.log;

  ...

}

После внесения изменений в конфигурационный файл необходимо перезапустить сервер NGINX для применения новых настроек.

После этого NGINX будет записывать информацию о перезаписи URL-адресов в лог-файл, который можно найти в указанном пути ( /var/log/nginx/rewrite.log в нашем примере). Эта информация может помочь в выявлении проблем в правилах перезаписи и определении того, как они применяются к запросам.

Лучший хостер с адекватными сис. админами: https://clck.ru/35zGfN
L
На сайте с 10.02.2015
Offline
234
#2

Между прочим.

Когда есть \w, то в 

[a-z0-9'+\w-]

a-z0-9 можно удалить

br.almighty
На сайте с 13.07.2021
Online
61
#3
tial :
rewrite ^link/([a-z0-9+'\w-]+) /base/main.php?name=$1 break;

Попробуйте так

rewrite ^link/(.*)$ /base/main.php?name=$1 break;
L
На сайте с 10.02.2015
Offline
234
#4
tial :
Можно как-нибудь решить эту проблему?

Вырезать отсюда

tial :
site.com/link/my1-link

на стороне php, если это возможно ($_SERVER['REQUEST_URI']).

Как по мне, пробрасывание GET параметрами - прошлый век

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий