Перепишите регулярное выражение в nginx

#regex #nginx #url-rewriting

Вопрос:

Это конфигурация nginx:

 location @rewrite {
    rewrite ^/threads/ /thread.php?$uriamp;$args last;
}
 

Этот код работает нормально, но сейчас я хочу использовать другой маршрут.

 OLD: /threads/123-yyy-yyy-yyy
NEW: /xxx-xxx-xxx/123-yyy-yyy-yyy
 

Я пробовал что-то вроде:

 rewrite ^/[w] /([d] -[w] )?$ /thread.php?$1amp;$args last;
rewrite ^/[w] /([d] -[w] )?$ /thread.php?$1amp;$args last;
rewrite ^/w /(d -w )?$ /thread.php?$1amp;$args last;
rewrite ^/w /(d -w )$ /thread.php?$1amp;$args last;
 

Но страница не найдена, так что я предполагаю, что в моем регулярном выражении что-то не так.
Может быть, это параметр $uri/$1?

Ответ №1:

  1. Вам не нужно добавлять amp;$args в свои правила перезаписи. Как rewrite указано в документации nginx,

Если строка замены содержит новые аргументы запроса, после них добавляются предыдущие аргументы запроса. Если это нежелательно, установка вопросительного знака в конце строки замены позволяет избежать их добавления, например:

 rewrite ^/users/(.*)$ /show?user=$1? last;
 
  1. w метасимвол включает a-z , A-Z , 0-9 и подчеркивание( _ ). Он не включает символ тире. Вы можете попробовать это регулярное выражение:
     rewrite ^/[-w] /([d] -[-w] )$ /thread.php?$1 last;