【问题标题】:drupal multisite htaccess: rewrite all languages to default language on one subsitedrupal multisite htaccess:在一个子站点上将所有语言重写为默认语言
【发布时间】:2011-12-28 14:37:15
【问题描述】:
  • 我有一个 Drupal 6 多站点,有 2 个域(www.example.com 和 www.domain.com),共享一些公共内容。

  • 域 example.com 使用三种语言(EN、FR、NL)。语言由路径前缀(/en、/fr、/nl)设置。另一个域 domain.com 仅使用一种语言 (NL)。

  • 问题:在很多情况下 domain.com 以错误的语言显示,即使没有填写路径前缀。不知何故,它似​​乎默认为 EN,尽管它没有不要总是那样做——行为似乎不是很一致。

  • 解决方案(至少我希望如此):因为我不是 Drupal 开发人员(我从一位前同事那里继承了该站点)我不知道如何在 Drupal 中解决这个问题,所以我认为修复它的最佳方法是向 .htaccess 添加一些重写规则。

  • 我也不是 htaccess/regex 专家,不能让它工作。您可以在下面找到我当前的重写规则,欢迎任何帮助或建议。

  • 一些例子:

    • www.domain.com/fr/some-title 需要改写为www.domain.com/nl/some-title
    • www.domain.com/node/1975 需要改写为www.domain.com/nl/node/1975

这些是已经存在的重写规则:

# Rewrite URLs of the form 'x' to the form 'index.php?q=x'.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/favicon.ico
RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]

我尝试添加这个:

RewriteCond %{HTTP_HOST} ^(www.)?domain.com$ [NC]
RewriteRule ^/(.*)$ /nl/$1

并且希望这只是将 /nl/ 添加到所有路径(因此不是一个完整的解决方案,因为 /fr/some-title 将变为 /nl/fr/some-title) - 但是,快速测试告诉我:

  • /fr/some-title 被重写为 /nl/some-title(这是我需要的,但不是我所期望的)
  • /some-title 未被重写

  • 问题:有什么想法可能有问题吗?或者这可能是由其他(Drupal)设置引起的?或者有没有更好的方法来解决我的问题?

  • 为了完整起见:直播网站是www.cinemazuid.be

【问题讨论】:

  • admin/settings/language 你可以设置默认语言。虽然我不知道这在多晶石上是如何工作的。你检查过这个吗?我想你添加了你的 RewriteRule before 其他的? (L表示之后不会执行其他的RewriteRules)
  • @lumbric 1) /nl 设置为默认值。 2)是的重写规则是之前以L结尾的重写规则。3)我不明白你的第二条评论:-/
  • 嗯,Drupal 不尊重Accept-Language
  • 抱歉,第二次尝试:这里出了点问题。 /fr/some-title 是否正确重写为 /nl/some-title?但在你说它会变成/nl/fr/some-title?
  • @lumbric 对不起,我的错 - 我现在看到那部分有点不清楚,我改写了一下......

标签: regex apache drupal .htaccess mod-rewrite


【解决方案1】:

如果这条规则

重写规则 ^/(.*)$ /nl/$1

在您的 .htaccess 文件中,我很惊讶它的工作原理是因为前导 / 总是被去掉,所以理论上它不应该匹配任何请求。

如果您希望为那些未指定语言的请求强制使用默认语言 NL,请在任何现有规则之前将以下规则添加到 .htaccess 文件的顶部

#if request is for existing file or directory
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
#then stop processing
RewriteRule .* - [L]

#replace fr with nl. This rule
RewriteRule ^fr/(.*)$ /nl/$1 [L,R=301]

#if the request does not have a language of en or nl
RewriteCond %{REQUEST_URI} !^/(en|nl)/ [NC]
#redirect with nl as default language
RewriteRule .+ /nl%{REQUEST_URI} [L,R=301]

如果您不想重定向,只需删除R=301

我编辑了上面的代码,将/fr/some-title 替换为/nl/some-title/L 标志告诉 mod_rewrite 停止处理进一步的规则,这通常是你想要的,除非你有另一个规则需要进一步处理当前的请求。

【讨论】:

  • 感谢您的建议。但是,我有一些问题:1)它似乎缺少一个元素:/fr/some-title 也应该重写为 /nl/some-title/ 2)我如何将其整合到现有的重写规则中?有人告诉我 L 表示“最后重写规则”,您的建议也包含此标志?
  • 再次感谢,+1。我仍然缺少一些元素(比如如何与现有的 index.php 重写规则集成)。但是,我已经测试了一些额外的东西,看起来事情更复杂了——即使没有重写规则,一些页面也被重定向到 /nl,而另一些则不是。我不能在这方面浪费太多时间,所以我想我最好的办法是尝试找一个 Drupal 开发人员来看看它......
【解决方案2】:
#redirect /fr/* and /en/* to /*
RewriteCond %{HTTP_HOST} ^(www\.)?domain\.com$ [NC]
RewriteRule ^(en|fr)/(.*)$ /$2 [R,L]

#internally rewrite /* to /nl/*
RewriteCond %{HTTP_HOST} ^(www\.)?domain\.com$ [NC]
RewriteCond $1 !^nl/$ [NC]
RewriteRule ^(.*)$ /nl/$1

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-24
    • 2013-11-03
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 2012-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多