![nginx 重写指令的替换 URI 中尾随问号 (?) 的影响](https://linux22.com/image/768379/nginx%20%E9%87%8D%E5%86%99%E6%8C%87%E4%BB%A4%E7%9A%84%E6%9B%BF%E6%8D%A2%20URI%20%E4%B8%AD%E5%B0%BE%E9%9A%8F%E9%97%AE%E5%8F%B7%20(%3F)%20%E7%9A%84%E5%BD%B1%E5%93%8D.png)
我试图理解rewrite ^/search/(.*)$ /search.php?q=$1
和之间的区别rewrite ^/search/(.*)$ /search.php?q=$1?
。区别在于?
替换 URI 中的尾随。
如果请求 URI 是,/search/apple?opt=123
那么 URI 会如何以不同的方式重写?
我猜是这样rewrite ^/search/(.*)$ /search.php?q=$1
的,但我不知道。/search.php?q=apple&opt=123
rewrite ^/search/(.*)$ /search.php?q=$1?
/search.php?q=apple
答案1
按照https://nginx.org/r/rewrite.。
如果替换字符串包含新的请求参数,则先前的请求参数将附加在其后。如果不希望出现这种情况,请在替换字符串末尾放置一个问号,以避免附加这些参数
这是测试此场景的最少代码……
# configuration file /etc/nginx/nginx.conf:
events {}
http {
server {
rewrite ^/search/(.*)$ /search.php?q=$1 permanent;
# rewrite ^/search/(.*)$ /search.php?q=$1? permanent;
}
}
永久标志仅用于测试。我们可以将上述代码保存为nginx.conf
并启动 Nginx。curl
上述代码的输出确认/search/apple?opt=123
将重定向到/search.php?q=apple&opt=123
。
同样,对于第二个重写条件......
# configuration file /etc/nginx/nginx.conf:
events {}
http {
server {
# rewrite ^/search/(.*)$ /search.php?q=$1 permanent;
rewrite ^/search/(.*)$ /search.php?q=$1? permanent;
}
}
curl
上述代码的输出确认/search/apple?opt=123
将重定向到/search.php?q=apple
。
所以,
如果请求 URI 是 /search/apple?opt=123,那么 URI 会如何以不同的方式重写?
我猜测重写 ^/search/(。)$ /search.php?q=$1 它将是 /search.php?q=apple&opt=123 并且重写为 ^/search/(.)$ /search.php?q=$1? 它会是 /search.php?q=apple? 但我不确定。
你是对的,这是预期的结果。