Назад | Перейти на главную страницу

Nginx и сложные перезаписи URI

У меня проблема с логикой переписывания Nginx. Они должны быть в директиве сервера или местоположения?

Мне нужно переписать один длинный и пугающий URL-адрес на другой. Есть ли кто-нибудь, кто может помочь или хотя бы показать ресурсы, чтобы это сделать?

Пример:

Мне нужно перенаправить это: http://www.example.com/products.asp?category=Games&product=Glide%20SX%202012%20-%20%20Super%20Partno&utm_source=wcl-ht

в это: http://www.example.com/games/2xu-glid/

Это вообще возможно?

Спасибо за вашу помощь.

1. Работа с аргументами

Несмотря на то, что говорит Теро Килканен, nginx вполне способен обрабатывать аргументы: это делается с помощью args и arg_ переменные из основного модуля.

2. rewrite контекст

Как заметил Глюон, rewrite можно использовать в server, location и if контексты, как указано в документации.

if следует избегать любой ценой, поэтому я не буду вдаваться в подробности здесь.

Теперь вы должны использовать rewrite в server или location?

В server

Блоки rewrites будут рассматриваться последовательно, и будет использоваться первое соответствие. Таким образом, ваша конфигурация зависит от порядка директив, что плохо (это одна из ошибок Apache).

Посмотреть на себя:

rewrite ^/(?<category>[^/]+)/(?<product>[^/]+) /products.asp?category=$category&product=$product&utm_source=wcl-ht last;
rewrite ^/games/(?<product>[^/]+) /games.asp?product=$product&utm_source=wcl-ht last;

перенаправит на products.asp, while

rewrite ^/games/(?<product>[^/]+) /games.asp?product=$product&utm_source=wcl-ht last;
rewrite ^/(?<category>[^/]+)/(?<product>[^/]+) /products.asp?category=$category&product=$product&utm_source=wcl-ht last;

перенаправит на games.asp.

Согласно передовой практике, лучше заключать директивы маршрутизации регулярных выражений (rewrite, но также регулярное выражение location) внутри префиксов.

В location

Вы можете переписать предыдущие примеры как

location /games {
    rewrite ^/games/(?<product>[^/]+) /games.asp?product=$product&utm_source=wcl-ht;
}

location / {
    rewrite ^/(?<category>[^/]+)/(?<product>[^/]+) /products.asp?category=$category&product=$product&utm_source=wcl-ht;
}

Используя расположение префиксов, вы гарантируете, что какой бы порядок вы ни использовали, результат будет всегда быть таким же.

3. Минимальная конфигурация

Вот минимальная конфигурация, направленная в том направлении, в котором вы хотите.

Нет очевидного правила перевода из 2xu-glid в Glide% 20SX% 202012% 20-% 20% 20Super% 20Partno. Если это зависит от нетривиальных условий и сложных проверок, вероятно, для этого лучше использовать скрипты. С помощью if внутри nginx опасно, не зная, что вы делаете, и может нанести ущерб. Вы также можете использовать множество вложенных местоположений, чтобы разделить правила перевода на модульные единицы.

Обратите внимание, что здесь я использую однократную перезапись, поэтому для нее не нужен флаг и не нужно заключать ее в какое-либо место. Это потому, что существует только один способ разрешения конфигурации.

Также обратите внимание на использование return в конце, чтобы гарантировать, что ни один файл не будет обслуживаться (поведение по умолчанию, когда подходящее место не найдено, это попытаться обслужить файл или index.html from the requested directory, в зависимости от того, заканчивается ли URI на /). Поскольку нет root определен, использовался бы внутренний набор по умолчанию.

events {
    worker_connections  1024;
}


http {
    default_type  text/html;

    server {
        listen       80;

        rewrite ^/(?<category>[^/]+)/(?<product>[^/]+) /products.asp?category=$category&product=$product&utm_source=wcl-ht last;

        location /products.asp {
            internal;
            return 200 "Arguments: $args<br />arg_category: $arg_category<br />arg_product: $arg_product<br />arg_utm_source: $arg_utm_source";
        }

        return 404;
    }
}