我被要求制作现有的多语言网站。
为此做准备我必须将所有现有页面从/ 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之后用语言重写了这个。我仍然陷入困境。
答案 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
!