htaccess检测到指定URL参数存在时重定向不生效如何解决
解决方案
之前写法的问题
- 第一种写法错误原因:在.htaccess上下文直接使用
$1/?xxx的写法时,mod_rewrite会默认拼接文件系统物理路径到跳转地址中,因此出现了/var/www/web6/htdocs/这类服务器本地路径。 - 第二种写法错误原因:跳转地址写死为
/?xxx根路径开头,自然会丢失原请求的/somepage/someother/路径部分。
正确配置
Apache 2.4 及以上版本推荐写法
RewriteCond %{QUERY_STRING} (^|&)entryValue=somevalue(&|$) RewriteRule ^ %{REQUEST_URI}?product=test&special=12345ls&linkSource=website [L,R=302,QSD]
Apache 2.2 旧版本兼容写法
RewriteCond %{QUERY_STRING} (^|&)entryValue=somevalue(&|$) RewriteRule ^ %{REQUEST_URI}?product=test&special=12345ls&linkSource=website? [L,R=302]
说明
%{REQUEST_URI}是Apache内置变量,代表当前请求的完整路径(不含域名和查询参数),比如原请求的路径就是/somepage/someother/,不会拼接物理路径也不会丢失原有路径,完全适配需求。QSD标志作用是丢弃原始请求的查询字符串,避免原参数entryValue=somevalue被拼接到新的跳转地址后面;旧版本Apache在参数末尾加?可以实现同样效果。- 当前用的是
R=302临时跳转,测试确认跳转逻辑正常后,可以改成R=301做永久跳转,利于SEO。 - RewriteCond末尾加的
(&|$)是为了避免误匹配entryValue=somevalue123这类参数值,规则更严谨。 - 请确保你的Apache已经加载了mod_rewrite模块,且.htaccess文件的权限配置中AllowOverride设置为All或者包含FileInfo权限,否则重写规则不会生效。
内容的提问来源于stack exchange,提问作者WimDiesel
相关产品推荐
相关产品推荐

