6

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

为此,我不得不将所有现有页面从 /path/page 移动到 /en/path/page

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

这是我目前拥有的;

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 之后的语言重写。我仍然陷入循环。

4

1 回答 1

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

于 2013-08-14T11:13:50.463 回答