在htaccess中设置条件重定向

时间:2013-08-14 10:54:22

标签: .htaccess redirect

我被要求制作现有的多语言网站。

为此做准备我必须将所有现有页面从/ path / page移动到/ en / path / page

要维护任何现有的传入链接,我现在需要设置一个htaccess重定向,以便将来自原始网址的任何请求发送到新的/ en / path / page网址,但是我无法让它工作。

这就是我现在所拥有的;

RewriteCond %{REQUEST_URI} !^/en$
RewriteRule ^(.*)$ /en/$1 [R=301,L]

认为意味着要检查所请求的URI,如果它不是以/ en开头,那么将/ en添加到请求的URI ...但我显然是错的,因为它没有不行。

任何帮助表示赞赏。谢谢。

更新。 由于这是一个ExpressionEngine站点,并且有一个额外的规则来删除URL的index.php部分,这里都是规则

# Rewrite for new language based urls
# This is to try and get all current pages going to /en/(old url) with a 301 redirect
RewriteCond %{REQUEST_URI} !^/en(/.*)?$
RewriteRule ^(.*)$ /en/$1 [R=301,L]


# Removes index.php
RewriteCond $1 !\.(gif|jpe?g|png|ico)$ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php/$1 [L]

我还在index.php之后用语言重写了这个。我仍然陷入困境。

1 个答案:

答案 0 :(得分:6)

它的作用是,检查URI是否不完全/en,因为$表示en之后的字符串结尾。

试试这个,它会检查URI是不是/en还是/en/,还是不以/en/开头,如果是这样,它会先于/en/

RewriteCond %{REQUEST_URI} !^/en(/.*)?$
RewriteRule ^(.*)$ /en/$1 [R=301,L]

更新考虑到.htaccess文件中的其他规则,有必要让语言规则再次与以下内部重定向/index.php...不匹配,否则你最终会得到一个无限循环。

可能有更好的方法来阻止这种情况,但是我想到的第一件事就是在第一个条件下检查index.php

RewriteCond %{REQUEST_URI} !^/(index\.php|en)(/.*)?$

因此,这将导致规则在内部重定向后不应用。但是要小心,这解决了这个特定情况的问题,只有内部重定向转到index.php