我想通过从所有查询字符串中删除括号来清理URL。
我尝试了以下代码,但无法使其正常工作。
RewriteCond %{REQUEST_URI} [\(\)]+
RewriteRule ^(.*)[\(]+([^\)]*)[\)]+(.*)$ /$1$2$3 [R=301,L]
以下是网址示例:
http://www.example.com/blog/abc-post/?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+blogname+(Blog+Name+New+York)
答案 0 :(得分:0)
为了匹配查询字符串,您需要检查QUERY_STRING
指令中的RewriteCond
服务器变量。
以下是执行此操作的一些方法:
例如,要删除URL的查询字符串部分中的任意数量的打开/关闭括号:
RewriteCond %{QUERY_STRING} (.*)[()]+(.*)
RewriteRule (.*) /$1?%1%2 [R,NE,L]
示例中需要NE
标志,以避免%编码字符(即。%3A
)被双重编码。
但是,这将导致多个重定向,具体取决于括号的“组”数。在您的示例中,这将导致两个重定向,因为有两个括号的“组”(每个“组”中有一个括号)。
如果括号总是匹配对,那么您可以专门检查开/关括号并可能减少重定向的数量。
RewriteCond %{QUERY_STRING} (.*)\((.*)\)(.*)
RewriteRule (.*) /$1?%1%2%3 [R,NE,L]
在您的示例中,这会导致单个重定向,因为只有一对括号。但是/abc?foo=(bar)&one=(two)
会导致两次重定向。
此方法执行多个内部重写以删除括号,然后在替换所有括号后执行单个重定向:
# Remove parentheses from query string
RewriteCond %{QUERY_STRING} (.*)[()]+(.*)
RewriteRule (.*) /$1?%1%2 [E=REPLACED_PARENS:1,NE,L]
# Redirect to "clean" URL
RewriteCond %{ENV:REDIRECT_REPLACED_PARENS} 1
RewriteCond %{THE_REQUEST} ^GET\ /(.*)\?
RewriteRule ^ /%1 [R,NE,L]
第一条规则在内部重写请求,并在需要替换时设置环境变量。
第二个规则检查此环境变量(请注意,在第一次重写后,REPLACED_PARENS
变为REDIRECT_REPLACED_PARENS
)并最终重定向到已清理的URL。从初始请求(包含在THE_REQUEST
服务器变量中)中获取URL路径,以避免在请求裸目录时(或前端控制器)无意中重定向到目录索引(例如index.php
)使用)。