更正RegEx以避免使用重写规则重定向301的无限循环

时间:2013-08-07 17:27:13

标签: regex .htaccess mod-rewrite apache2 http-status-code-301

我试图告诉我的服务器重定向以下请求:

http://example.es
http://example.es/
http://example.es/es
http://example.es/es/
http://www.example.es
http://www.example.es/
http://www.example.es/es

到这个页面:

http://www.example.es/es/

为了做到这一点,我在.htaccess中有以下内容

#RewriteEngine On    # Turn on the rewriting engine
RewriteBase /
RewriteCond %{HTTP_HOST} ^(\.?example\.es(/|/es|/es/)?|www\.?example\.es(/|/es)?)$ [NC]
RewriteRule ^(.*)$ http://www.example.es/es/ [R=301,L]

问题在于它会导致无限重定向,因为所需的URL http://www.example.com/es/也包含HTTP_HOST字符串。事情是我找不到准确的正则表达式来避免这个问题。

.htaccess的其余部分如下:

php_flag register_long_arrays on
php_flag register_globals on
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css javascript application/javascript
ExpiresActive On
ExpiresByType text/css "access plus 1 years"
ExpiresByType image/png "access plus 1 years"
ExpiresByType application/javascript "access plus 1 years"

Header set Connection keep-alive

非常感谢帮助!

干杯!

3 个答案:

答案 0 :(得分:1)

AFAIK Apache的重写使用PERL正则表达式,因此支持负向前瞻。您可以使用一个来避免将http://www.example.com/es/与自身匹配。尝试:

^(\.?example\.com(/|/es|/es/)?|www\.?example\.com(/|/es(?!/))?)$

答案 1 :(得分:1)

请记住,%{HTTP_HOST}仅匹配网址中的主机名。

用以下代码替换您的代码:

Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On

RewriteCond %{HTTP_HOST} ^(www\.)?(example\.ws)$ [NC]
RewriteRule (?!^es/)^(.*)$ http://www.%1/es/$1 [R=301,L,NC]

答案 2 :(得分:0)

我得到这样的答案:

Options +FollowSymLinks -MultiViews
RewriteEngine On    # Turn on the rewriting engine
RewriteCond %{HTTP_HOST} ^(www\.)?(example\.es)$ [NC]
RewriteRule ^(/|/es|/es/)?$ http://www.example.es/es/$1 [R=301,L,NC]

谢谢大家的帮助!!