NGINX单动态页面跨站重定向配置失效问题求助
NGINX单动态页面跨站重定向配置失效问题求助
兄弟,你的问题出在NGINX匹配请求的逻辑上,我来给你捋捋为啥之前的配置不生效,再给你两个可行的解决方案:
先说说你之前配置的问题
- 第一个配置里,
location /course/view.php?id=24完全不对——NGINX的location指令只匹配请求的URI部分(也就是/course/view.php),不会包含?后面的查询参数,所以这个location规则永远不会被触发。 - 第二个配置的rewrite写法有漏洞:既没指定重定向的状态码(比如301永久重定向),也没正确处理查询参数的匹配逻辑,而且还漏了协议前缀(http/https),自然达不到预期效果。
正确的配置方案
方案一:用精确匹配+内置变量判断(推荐)
这种方式逻辑清晰,性能也不错:
# 精确匹配URI为/course/view.php的请求 location = /course/view.php { # 用NGINX内置变量$arg_id获取查询参数里的id值,判断等于24时重定向 if ($arg_id = 24) { return 301 $scheme://www.example.com/dir/dir; } }
location =是精确匹配,只会命中URI完全等于/course/view.php的请求,避免误匹配其他类似路径;$arg_id是NGINX预定义的变量,自动提取查询参数中id对应的值;$scheme会自动使用当前请求的协议(http/https),保证重定向前后协议一致。
方案二:用rewrite指令直接匹配
如果习惯用rewrite,也可以这么写:
# 放在server块下即可 rewrite ^/course/view.php$ $scheme://www.example.com/dir/dir? permanent if ($arg_id = 24);
^/course/view.php$是正则匹配精确的URI;- 末尾的
?是为了去掉原请求的查询参数,避免重定向后URL带上?id=24; permanent表示301永久重定向,如果你需要临时重定向可以换成redirect(对应302);if ($arg_id = 24)是额外的匹配条件,只有id等于24时才触发重定向。
最后别忘了!
修改完配置后,一定要重载NGINX让配置生效:
sudo nginx -s reload
备注:内容来源于stack exchange,提问作者Rogue
相关产品推荐
相关产品推荐

