从重写规则

时间:2017-07-17 18:58:11

标签: .htaccess mod-rewrite

我想通过从所有查询字符串中删除括号来清理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)

1 个答案:

答案 0 :(得分:0)

为了匹配查询字符串,您需要检查QUERY_STRING指令中的RewriteCond服务器变量。

以下是执行此操作的一些方法:

1。任意数量的括号 - 多个重定向

例如,要删除URL的查询字符串部分中的任意数量的打开/关闭括号:

RewriteCond %{QUERY_STRING} (.*)[()]+(.*)
RewriteRule (.*) /$1?%1%2 [R,NE,L]

示例中需要NE标志,以避免%编码字符(即。%3A)被双重编码。

但是,这将导致多个重定向,具体取决于括号的“组”数。在您的示例中,这将导致两个重定向,因为有两个括号的“组”(每个“组”中有一个括号)。

2。任意数量的括号 - 多次(但更少)重定向

如果括号总是匹配对,那么您可以专门检查开/关括号并可能减少重定向的数量。

RewriteCond %{QUERY_STRING} (.*)\((.*)\)(.*)
RewriteRule (.*) /$1?%1%2%3 [R,NE,L]

在您的示例中,这会导致单个重定向,因为只有一对括号。但是/abc?foo=(bar)&one=(two)会导致两次重定向。

3。任意数量的括号 - 单个重定向

此方法执行多个内部重写以删除括号,然后在替换所有括号后执行单个重定向:

# 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)使用)。