【问题标题】:Set up of conditional redirect in htaccess在 htaccess 中设置条件重定向
【发布时间】:2013-08-14 20:11:52
【问题描述】:

有人要求我将现有网站制作成多语言。

为此我不得不将所有现有页面从 /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 之后的语言重写。我仍然陷入循环中。

【问题讨论】:

    标签: .htaccess redirect


    【解决方案1】:

    它的作用是检查 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

    【讨论】:

    • 谢谢,我已经尝试过了,但仍然无法正常工作。我在想这里还有别的东西在起作用。这是一个 ExpressionEngine 驱动的站点,它也使用 htaccess 来删除 URL 的 index.php 部分。我将更新我的问题以显示正在执行此操作的重写器。
    • 最后一条规则导致另一个(内部)重定向,mod_rewrite 将针对这个新 URI 再次评估规则,第一个规则将再次匹配。我会更新我的答案。
    • 您更新的建议有效。我只需要添加几个条件来阻止图像和脚本被重定向。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-28
    • 1970-01-01
    • 1970-01-01
    • 2015-04-12
    相关资源
    最近更新 更多