通过.htaccess替换查询字符串中的字符

lit*_*red 6 .htaccess mod-rewrite query-string

我的客户想要在某些页面上查询字符串(通过将%更改为A).

例如,我可以通过以下方式在所需页面上完全删除查询字符串:

RewriteCond %{QUERY_STRING} !="" 
RewriteCond %{REQUEST_URI} ^/SpecialPage(.*) 
RewriteRule ^(.*)$ /$1? [R=301,L] #remove query string
Run Code Online (Sandbox Code Playgroud)

这是我认为应该删除查询字符串上的%并替换为A,但它不是:

RewriteCond %{QUERY_STRING} ^(.*)\%(.*)$
RewriteCond %{REQUEST_URI} ^/SpecialPage(.*)
RewriteRule ^(.*)$ /$1?%1A%2  [L]
Run Code Online (Sandbox Code Playgroud)

我在这做错了什么?我只是无法发现它.感谢专家的眼睛!

Jon*_*Lin 1

你真的很接近。

这里的问题是你有一个条件并且你的规则的匹配应该在一起。您对前一个的反向引用RewriteCond已损坏,因为它是针对REQUEST_URI不是想要的QUERY_STRING 。

RewriteCond %{REQUEST_URI} ^/SpecialPage(.*)
RewriteRule ^(.*)$ /$1?%1A%2  [L]
Run Code Online (Sandbox Code Playgroud)

此处,%1(.*)反向引用与 URI末尾的匹配/SpecialPage。查询字符串匹配的反向引用会丢失,而这正是您真正想要的。您可以组合条件以将 REQUEST_URI 与以下中的正则表达式模式相匹配RewriteRule

RewriteCond %{QUERY_STRING} ^(.*)\%(.*)$
RewriteRule ^SpecialPage(.*)$ /SpecialPage$1?%1A%2  [L]
Run Code Online (Sandbox Code Playgroud)

此处,%1%2反向引用正确引用查询字符串,并且正则SpecialPage表达式模式满足 URI 中的条件。