Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex drupal multisite htaccess:在一个子网站上将所有语言重写为默认语言_Regex_Apache_Drupal_.htaccess_Mod Rewrite - Fatal编程技术网

Regex drupal multisite htaccess:在一个子网站上将所有语言重写为默认语言

Regex drupal multisite htaccess:在一个子网站上将所有语言重写为默认语言,regex,apache,drupal,.htaccess,mod-rewrite,Regex,Apache,Drupal,.htaccess,Mod Rewrite,我有一个Drupal6多站点,有两个域(www.example.com和www.domain.com),共享一些公共内容 域名example.com有三种语言(EN、FR、NL)。语言由路径前缀(/en、/fr、/nl)设置。另一个domain.com仅使用一种语言(NL) 问题:在许多情况下,domain.com以错误的语言显示,即使没有填写路径前缀。不知何故,它似乎默认为EN,尽管它并不总是这样做——行为似乎不太一致 解决方案(至少我希望如此):由于我不是Drupal开发人员(我从一位前同事

我有一个Drupal6多站点,有两个域(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
      (这是我需要的,但不是我期望的)
    • /某些标题
      未重写

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

    • 为了完整起见:live网站

    如果此规则

    重写规则^/(.*)$/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停止处理进一步的规则,这通常是您想要的,除非您有另一个规则需要进一步处理当前请求。

    如果此规则

    #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]
    
    重写规则^/(.*)$/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停止处理进一步的规则,这通常是您想要的,除非您有另一个规则需要进一步处理当前请求。

    在admin/settings/language中,您可以设置默认语言。虽然我不知道这在多站点上是如何工作的。你检查过这个了吗?我想你在其他规则之前加入了你的规则?(L表示以后不会执行其他重写规则)@lumbric 1)/nl设置为默认值。2) 是的,重写规则在以L结尾的重写规则之前。3)我不明白你的第二条评论:-/Hmm,Drupal honor
    不接受语言吗<代码>/fr/某些标题
    是否正确重写为
    /nl/某些标题
    ?但是在你说它将成为
    /nl/fr/某个标题之前
    ?@lumbric抱歉,我的不好-我知道现在那部分有点不清楚,我重新措辞了一点…在admin/settings/language中,你可以设置默认语言。虽然我不知道这在多站点上是如何工作的。你检查过这个了吗?我想你在其他规则之前加入了你的规则?(L表示以后不会执行其他重写规则)@lumbric 1)/nl设置为默认值。2) 是的,重写规则在以L结尾的重写规则之前。3)我不明白你的第二条评论:-/Hmm,Drupal honor
    不接受语言吗<代码>/fr/某些标题
    是否正确重写为
    /nl/某些标题
    ?但在你说它将成为
    /nl/fr/某个标题之前
    ?@lumbric抱歉,我的错-我知道现在那部分有点不清楚,我重新措辞了一点…谢谢你的建议。但是,我有一些问题:1)它似乎缺少一个元素:/fr/某些标题也应重写为/nl/某些标题/2)如何将其集成到现有的重写规则中?我听说L表示“上次重写规则”,而你的建议也包含此标志?再次感谢,+1。但我仍然缺少一些元素(比如如何与现有index.php重写规则集成)。然而,我测试了一些额外的东西,看起来事情更复杂了——即使没有重写规则,一些页面也会重定向到/nl,而其他页面则不会。我不能在这上面浪费太多时间,所以我想我最好的办法是找一个Drupal开发人员来看看……谢谢你的建议。然而,我有一些问题:1)我
    #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]