通过 .htaccess 替换查询字符串中的字符
Posted
技术标签:
【中文标题】通过 .htaccess 替换查询字符串中的字符【英文标题】:replace character in query string via .htaccess 【发布时间】:2012-07-10 07:31:55 【问题描述】:我的客户希望在某些页面上修改查询字符串(通过将 % 更改为 A)。
例如,我可以通过以下方式完全删除所需页面上的查询字符串:
RewriteCond %QUERY_STRING !=""
RewriteCond %REQUEST_URI ^/SpecialPage(.*)
RewriteRule ^(.*)$ /$1? [R=301,L] #remove query string
这是我认为应该删除查询字符串上的 % 并替换为 A 的内容,但事实并非如此:
RewriteCond %QUERY_STRING ^(.*)\%(.*)$
RewriteCond %REQUEST_URI ^/SpecialPage(.*)
RewriteRule ^(.*)$ /$1?%1A%2 [L]
我在这方面做错了什么?我就是看不出来。感谢专家的眼睛!
【问题讨论】:
【参考方案1】:你真的很亲密。
这里的问题是你有一个条件并且你的规则的匹配应该是在一起的。您对前一个 RewriteCond
的反向引用已损坏,因为它是针对 REQUEST_URI 而不是您想要的 QUERY_STRING。
RewriteCond %REQUEST_URI ^/SpecialPage(.*)
RewriteRule ^(.*)$ /$1?%1A%2 [L]
这里,%1 反向引用匹配/SpecialPage
URI 末尾的(.*)
。您的查询字符串匹配中的反向引用会丢失,而这正是您真正想要的。您可以结合条件来匹配 REQUEST_URI 与 RewriteRule
中的正则表达式模式:
RewriteCond %QUERY_STRING ^(.*)\%(.*)$
RewriteRule ^SpecialPage(.*)$ /SpecialPage$1?%1A%2 [L]
这里,%1 和 %2 反向引用正确地引用了查询字符串,并且正则表达式模式满足了 URI 中的 SpecialPage
条件。
【讨论】:
好的,我想我遵循这个,但是我得到一个内部服务器错误。我可以有这个:domain.com/SpecialPage?x=y%ff%dd%gqf312%ggg,我的客户希望那些 % 是“A”,例如domain.com/SpecialPage?x=yAffAddAgqfe312Aggg 那些是 URL 编码的转义(%ff、%dd 等),所以当它们到达重写引擎时,它们将被解码。 正确。这些是编码的,但我希望(我的客户是)他们仍然可以操纵;非常感谢您的帮助!【参考方案2】:重定向查询字符串
重写引擎开启 RewriteCond %QUERY_STRING ^(.)=(.)$ RewriteRule ^(.)?(.)$ /$1--%0? [R=301,L]
来自网址:http://localhost/sholay-slide.jsp?slide=2 到网址:http://localhost/sholay-slide.jsp--slide=2
【讨论】:
以上是关于通过 .htaccess 替换查询字符串中的字符的主要内容,如果未能解决你的问题,请参考以下文章