我被要求制作一个多语言的现有网站。
为此,我不得不将所有现有页面从/path/page 移动到/en/path/page
为了维护任何现有的传入链接,我现在需要设置一个 htaccess 重定向,以将任何请求从其原始 url 发送到新的/en/path/page url,但我无法使其正常工作。
这就是我目前拥有的;
RewriteCond %{REQUEST_URI} !^/en$
RewriteRule ^(.*)$ /en/$1 [R=301,L]
我认为这是为了检查请求的 URI,如果它不以/en 开头,则在请求的 URI 前面加上/en ......但我显然错了,因为它不起作用。
任何帮助表示赞赏。谢谢你。
更新。
由于这是一个 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 之后重写语言。我仍然陷入循环。
最佳答案
它的作用是检查 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
的特定情况下的问题。 !
关于.htaccess - 在 htaccess 中设置条件重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18229829/