使用mod_rewrite重定向不支持的语言代码

时间:2010-07-28 13:13:56

标签: regex apache mod-rewrite

我正在开发一个多语言网站,我正在使用网址中的语言标识符与前端控制器一起访问

http://www.domain.tld/en/content

http://www.domain.tld/de/conent

将提取以这些语言本地化的内容。如果在未指定语言标识符的情况下访问站点,则通过Accept-Language检测用户浏览器语言设置作为最佳猜测,然后重定向。如果无法检测到Accept-Language,则默认为英语。所以,例如,如果你访问

http://www.domain.tld/content

并且您的浏览器语言设置为德语,Accept-Language检测到de,您将被重定向到

http://www.domain.tld/de/content

如果您的浏览器语言设置不受支持,您将被重定向到默认支持的语言,英语

http://www.domain.tld/en/content

这样工作正常......只要不在url的开头手动输入带有不受支持的语言标识符的url即可。为了解释,我有mod_rewrite设置,以便不指向现有文件或文件夹的URL调用前端控制器。既然如此,如果我故意在浏览器中输入不受支持的语言代码,例如'it',

http://www.domain.tld/it/content

调用前端控制器,但我想避免这种情况,而是希望拥有Apache过滤器请求,以便只向前端控制器提供支持的语言。

基本上我想要的是能够定义一个规则,以便如果一个url不以受支持的语言标识符开头,那么用户将被重定向到一个url,该url用默认的一个替换不支持的语言代码(en)没有调用前端控制器。

这是我的配置文件:

# 
#   Access rights and behaviours for DocumentRoot
#       
<Directory /WWW>
    # 
    Options +FollowSymLinks +Indexes -MultiViews

    # Allow requests for all
    Order allow,deny
    Allow from all

    # Don't use access rules defined in child directories
    AllowOverride None 

    # Define the router as the default index page
    DirectoryIndex /router.php

    # Turn on url rewriting
    RewriteEngine on    

    # If we encounter a request to document root and can detect a language preference, grab it...
    RewriteCond %{HTTP:Accept-Language} ^(en|de|fr)[-,;]? [NC,OR]
    # ... or use the default language identifier (english) ...
    RewriteCond en ^(en)$
    # ... and redirect the request to a path prefixed with the language identifier
    RewriteRule ^$ /%1/ [R=301,L]


            # Mystery rule here!


    # If the requested file does not exist...
    RewriteCond %{REQUEST_FILENAME} !-f
    # ... or if the requested directory does not exist
    RewriteCond %{REQUEST_FILENAME} !-d

    # ...forward the request to the router
    RewriteRule ^(.*)$ router.php/$1 [L]        
</Directory>

我把“神秘规则放在这里!”注释是我需要定义规则的地方,这样如果请求uri不是以受支持的语言代码开头,那么将使用该文件。

我尝试过多种方式,但不断陷入重定向循环。举例说明我正在尝试做什么

RewriteCond %{REQUEST_URI} !^/(en|de|fr).$
RewriteRule ^$ /en/$1 [R=301,L]

这应该代表的是:

如果请求uri不是以en,de或fr开头,则抓取uri的剩余部分,用en作为前缀,然后重定向以使前端控制器拦截。

有人可以告诉我吗?谢谢!

1 个答案:

答案 0 :(得分:2)

尝试此规则:

RewriteRule !^(en|de|fr)/ /en%{REQUEST_URI} [R=301,L]

如果它尚未以/en/en/de开头,则会在URI路径的开头添加/fr