【问题标题】:How do I redirect a specific URL pattern when Drupal Clean URLs are on?当 Drupal Clean URL 开启时,如何重定向特定的 URL 模式?
【发布时间】:2010-12-01 22:52:33
【问题描述】:

我使用带有 Apache 和 mod_rewrite 模块的干净 URL 安装了 Drupal 5.23。我正在使用 .htaccess 文件来实现具有以下配置的干净 URL 功能:

<IfModule mod_rewrite.c>
    RewriteEngine on

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} !=/favicon.ico
    RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
</IfModule>

我将禁用网站上的本地化/国际化插件,这会将网站上每个页面的 URL 从 http://www.example.com/en/url-to-a-page 更改为 http://www.example.com/url-to-a-page/en 部分将被删除)。

我想添加一个 mod_rewrite 规则,以便为 URL 中带有 /en 部分的任何传入 URL 提供 HTTP 301 重定向响应,以便将它们定向到正确的页面。

我尝试在我的.htaccess 文件的现有规则上方和下方添加以下行,但在这两种情况下,访问带有/en 的页面都会导致 HTTP 404 Not Found 响应:

RewriteRule ^en/(.+)$ http://www.example.com/$1 [R=301]

如果我注释掉现有规则,我的规则就可以正常工作。我也尝试在规则中添加条件,但这似乎也没有效果:

RewriteCond %{REQUEST_URI} =/en/*

【问题讨论】:

    标签: apache drupal mod-rewrite


    【解决方案1】:

    我在编写所有自定义重定向时遇到了这个问题,结果发现解决方案是在重定向行中添加一个“L”。尝试以下内容:

    RewriteRule ^en/(.+)$ http://www.example.com/$1 [L,R=301]
    

    注意行尾附近的“L”。根据the Apache RewriteRule docs,这意味着“在此处停止重写过程并且不再应用任何重写规则”。

    【讨论】:

    • 在这里指定您的更改和 redShadow 的更改,它正在工作!谢谢!
    【解决方案2】:

    除了 sillygwailo 的建议之外,我建议您确保您的 RewriteCond(我认为需要)确实匹配..

    来自 apache 文档:

    =CondPattern'(按字典顺序相等)
    将 CondPattern 视为纯字符串,并按字典顺序将其与 TestString 进行比较。如果 TestString 在字典上等于 CondPattern 则为真(两个字符串完全相等,字符对字符)。如果 CondPattern 为 ""(两个引号),则将 TestString 与空字符串进行比较。

    所以,它可能只匹配包含实际“*”的 URL..?不确定,但你也可以试试这个:

    RewriteCond %{REQUEST_URI} ^/en/.*
    

    【讨论】:

    • 你是对的。随着您在此处指定的更改和 sillygwailo 的更改,它正在工作!谢谢!
    猜你喜欢
    • 2015-05-02
    • 1970-01-01
    • 1970-01-01
    • 2012-05-12
    • 1970-01-01
    • 1970-01-01
    • 2018-12-29
    • 2018-12-15
    • 1970-01-01
    相关资源
    最近更新 更多