Nginx正则匹配含非查询字符串?的URL并实现重定向
Nginx重定向带?的博客URL解决方案
问题原因
你之前的匹配失败,是因为Nginx的location指令仅匹配请求URI(即?之前的部分),而?后面的内容属于查询字符串,不属于URI范畴。你的目标URL中,请求URI实际是/,?/blog/article/my-blog-post里的?是查询字符串的起始符,所以直接在location里写/?或/\?根本匹配不到目标请求。
解决配置
以下两种配置都能实现批量重定向,将https://example.co.uk/?/blog/article/any-blog-post永久重定向到https://example.co.uk/blog/any-blog-post:
方法一:使用if结合$request_uri(推荐)
server { # 你的其他server配置(监听端口、域名等) if ($request_uri ~ ^/\?/blog/article/(.*)$) { # 301是永久重定向,若需临时重定向可改为302 return 301 https://example.co.uk/blog/$1?; } }
$request_uri:包含客户端发送的完整请求路径(包括?和后续查询字符串),能精准匹配目标格式。- 正则
^/\?/blog/article/(.*)$:捕获/blog/article/之后的文章路径部分到变量$1。 - 末尾的
?:用于清除重定向后的URL中多余的查询字符串,避免出现https://example.co.uk/blog/any-blog-post?这种格式。
方法二:使用rewrite指令
server { # 你的其他server配置 rewrite ^/\?/blog/article/(.*)$ https://example.co.uk/blog/$1? permanent; }
这里的permanent等同于301永久重定向,同样通过正则捕获文章路径,末尾的?清除多余查询字符串。
注意事项
- 若你的Nginx配置中有多个
server块,确保将规则放在对应域名的server块下。 - 配置修改后,需执行
nginx -s reload重新加载配置生效。 - 优先使用
return指令,性能比rewrite更优。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

