如何用.htaccess将带多参数URL重定向到首参数命名的子路径?
解决带额外参数的URL重定向404问题
需要将带UTM等额外参数的旧URL:
https://example.com/blog/?p=title-of-blog-post&utm_source=browser&utm_medium=rss_notification&utm_id=600215.0720246513
重定向到简洁的友好URL:
https://example.com/blog/title-of-blog-post
仅提取第一个p参数,但当前配置的.htaccess因为额外参数的存在触发了404错误,原配置代码如下:
Options +FollowSymLinks +ExecCGI <IfModule mod_rewrite.c> RewriteEngine On RewriteBase /blog/ RewriteCond %{THE_REQUEST} \s/blog/\?p=([\w-]+)\s [NC] RewriteRule ^ %1? [R=301,L] RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^([\w-]+)/?$ ?p=$1 [L] RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L] </IfModule>
问题原因
第一个RewriteCond的正则表达式要求p=([\w-]+)后面必须紧跟空格(\s),但当URL带有额外参数时,p参数后面是&而非空格,导致规则匹配失败,无法触发重定向,最终返回404。
修复方案
修改第一个RewriteCond的正则,允许p参数后面跟随任意额外参数或者空格:
修改后的完整.htaccess代码:
Options +FollowSymLinks +ExecCGI <IfModule mod_rewrite.c> RewriteEngine On RewriteBase /blog/ # 匹配带p参数(可含其他额外参数)的旧URL,重定向到友好URL RewriteCond %{THE_REQUEST} \s/blog/\?p=([\w-]+)(?:&.*)?\s [NC] RewriteRule ^ %1? [R=301,L] # 将友好URL反向重写为带p参数的格式 RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^([\w-]+)/?$ ?p=$1 [L] # 所有其他请求转发到index.php RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L] </IfModule>
规则说明
(?:&.*)?是一个非捕获组,用于匹配&开头的任意后续参数(.*匹配任意字符),末尾的?表示这个组是可选的,兼容没有额外参数的情况- 重定向规则末尾的
?用于清空原URL的所有查询参数,确保重定向后的URL干净无多余参数
内容的提问来源于stack exchange,提问作者Finder
相关产品推荐
相关产品推荐

