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 ответ
1. Обработка аргументов
Несмотря на то, что говорит Теро Килканен, nginx вполне способен обрабатывать аргументы: это делается с помощью args
а также arg_
переменные из основного модуля.
2. rewrite
контекст
Как указал Глюон, rewrite
можно использовать в server
, location
а также if
контексты, как говорится в документации.
if
Следует избегать любой ценой, поэтому я не буду вдаваться в подробности об этом здесь.
Теперь вы должны использовать rewrite
в server
или же location
?
В server
Блоки rewrite
s будет считаться последовательно, и будет использовано первое совпадение. Ваша конфигурация, таким образом, зависит от порядка директив, что плохо (это одна из вещей, которые не подходят 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;
}
}