通过 .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 替换查询字符串中的字符的主要内容,如果未能解决你的问题,请参考以下文章

替换部分查询字符串

查询字符串到htaccess中的路径有点工作?

htaccess替换所有URL的一部分

String中的常用方法

sql 通过sql查询替换SQL数据库中的字符串

如何通过允许mod_rewrite作为查询字符串和页码来进行.htaccess搜索?