У меня есть конфигурация nginx, подобная этой:
map $request_uri $target { /test1234 https://www.somedomain.com/new_url?source=stackoverflow$is_args$args; } map $request_uri $target_code { /test1234 301; } server { listen 80 default; if ($target_code = 301) { return 301 $target; } }
Для /test1234 это работает, но если у меня есть /test1234?test=1 или любая строка запроса, то nginx не соответствует этому перенаправлению.Он должен работать для любых параметров.
/test1234
/test1234?test=1
Есть ли способ установить подстановочный знак для любой строки запроса?
Во-первых, вы используете переменную $request_uri, которая содержит полный исходный URI запроса с аргументами, поэтому ваша директива map никогда не будет совпадать, когда в запросе есть какие-либо параметры.Вместо этого используйте переменную $uri.
$request_uri
map
$uri
Во-вторых, представьте, что у вас есть запрос http://yourdomain.com/test1234?test=test.В $target вы получите https://www.somedomain.com/new_url?source=stackoverflow?test=test.Вы можете использовать дополнительную директиву map в своей конфигурации, чтобы избежать этого:
http://yourdomain.com/test1234?test=test
$target
https://www.somedomain.com/new_url?source=stackoverflow?test=test
map $is_args $args_prefix { ? &; } map $uri $target { /test1234 https://www.somedomain.com/new_url?source=stackoverflow$args_prefix$args; }
И наконец, я рекомендую использовать директиву location внутри вашего блока конфигурации server вместо if, дляНапример:
location
server
if
location = /test1234 { return 301 $target; }
Если есть зло !