У меня проблема с логикой переписывания 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/
Это вообще возможно?
Спасибо за вашу помощь.
Несмотря на то, что говорит Теро Килканен, nginx вполне способен обрабатывать аргументы: это делается с помощью args
и arg_
переменные из основного модуля.
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;
}
Используя расположение префиксов, вы гарантируете, что какой бы порядок вы ни использовали, результат будет всегда быть таким же.
Вот минимальная конфигурация, направленная в том направлении, в котором вы хотите.
Нет очевидного правила перевода из 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;
}
}