Часть URI, следующая за ?
, является строкой запроса (или аргументами) и не является частью нормализованного URI, используемого директивами location
и rewrite
, поэтому ваши правила никогда не будут совпадать.Подробнее см. в этом документе .
Если у вас есть сложные регулярные выражения, которые должны соответствовать всему URI (включая строку запроса), вам нужно использовать переменную $request_uri
.Это можно проверить с помощью if
или map
.При наличии нескольких регулярных выражений предпочтительным решением является map
.
Например:
map $request_uri $redirect {
default 0;
~^/oferty-specjalne/szczegoly-oferty\?OfferID=(124170|124296|124299|123483|63788|97002)$
/oferty-specjalne/;
~^/oferty-specjalne/szczegoly-oferty\?OfferID=(?<offerid>.*)$ /oferty-specjalne/$offerid;
~^/oferty-specjalne/szczegoly-oferty\?OfferID=97002 /oferty-specjalne/;
~^/oferty-specjalne/szczegoly-oferty /oferty-specjalne/;
}
server {
...
if ($redirect) {
return 301 $redirect;
}
Регулярные выражения оцениваются по порядку, пока не найдено соответствующее правило, поэтому порядокправила с наиболее конкретным первым и наименее конкретным последним.Используйте именованные захваты, поскольку числовые захваты могут выходить за рамки.Вам не нужно указывать схему или доменное имя, если они совпадают.Директива map
находится вне блока `server.Подробнее см. в этом документе .