重写规则有条件地替换

时间:2014-10-09 09:18:15

标签: regex apache .htaccess mod-rewrite duplicate-removal

我遇到了以下问题

我有一个多语言页面,其中包含以下网址格式:

foo.bar/foo
foo.bar/en/foo
foo.bar/de/foo
foo.bar/ru/foo

依旧......

由于我的默认语言是英语,因此我有重复的内容问题,因为

foo.bar/foo
foo.bar/en/foo

具有相同的内容

所以我不是.htaccess亲,我可以通过为每个网址重写条件来解决它:

RewriteCond %{HTTP_HOST} ^www.foo.bar$ [NC]
RewriteRule ^/foo /en/foo [R=permanent,L]

但我更喜欢的是一些通用的解决方案表达式,如:

if((first part after "/") != ("en/$" || "de/$" || "ru/$") { 
    add "en/$"
}

以便foo.bar重定向到foo.bar/en

foo.bar/bla/blu/ble重定向到foo.bar/en/bla/blu/ble

有人可以帮帮我吗?

更新:

使用

RewriteCond %{HTTP_HOST} ^(www\.)?foo\.bar$ [NC]
RewriteCond %{REQUEST_URI} !^/(en|de|ru)/ [NC]
RewriteRule ^ /en/%{REQUEST_URI} [L,NE,R=302]

并致电http://www.foo.bar

无限重定向到:

http://www.foo.bar/en//app.php

所以我猜它在ifmodule的最底部碰到了一些rewriterule 这似乎剥离了前控制器(app.php),继承代码:

RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$ 
RewriteRule ^(.*) - [E=BASE:%1] 

RewriteCond %{ENV:REDIRECT_STATUS} ^$ 
RewriteRule ^app\.php(/(.*)|$) %{ENV:BASE}/$2 [R=301,L]

1 个答案:

答案 0 :(得分:1)

您可以在DOCUMENT_ROOT/.htaccess文件中使用此代码:

RewriteEngine On

RewriteCond %{HTTP_HOST} ^(www\.)?foo\.bar$ [NC]
RewriteCond %{THE_REQUEST} !\s/(en|de|ru)/ [NC]
RewriteRule ^ /en/%{REQUEST_URI} [L,NE,R=302]