Перенаправить URL на URL на WWW - PullRequest
0 голосов
/ 13 декабря 2018

У меня проблема с перенаправлением URL-адреса на URL-адрес в nginx:

, например, у меня есть ссылка:

https://example.com/oferty-specjalne/szczegoly-oferty?OfferID=124296

рабочая функция:

location  ^/oferty-specjalne/szczegoly-oferty(.*)$  {
return 301 https://example.com/oferty-specjalne/; }

не работают функции:

location ~ ^/oferty-specjalne/szczegoly-oferty\?OfferID=(124170|124296|124299|123483|63788|97002)$  {
return 301 https://example.com/oferty-specjalne/; }

location ~ ^/oferty-specjalne/szczegoly-oferty?OfferID=(.*)$ {
    return 301 https://example.com/oferty-specjalne/$1; }

location  ^/oferty-specjalne/szczegoly-oferty?OfferID=97002 {
return 301 https://example.com/oferty-specjalne/; }

Я проверил регулярные выражения в тестерах, и все в порядке.Я спрашиваю информацию, где я делаю ошибку и как я могу ее исправить, или, например,

1 Ответ

0 голосов
/ 13 декабря 2018

Часть 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.Подробнее см. в этом документе .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...