使用HTACCESS在URL中处理语言代码.根据它重定向



我正在努力处理我的网站上的语言。

到目前为止,我正在处理我的页面

# Mother page, no child : http://www.example.com/2-news.html
RewriteRule ^([0-9]*)-([a-zA-Z-]*).html$ index.php?id=$1&parent=0 [L]
# Child page : http://www.example.com/2-news_1-news-title.html    
RewriteRule ^([0-9]*)-([a-zA-Z-]*)_([0-9]+)-([a-zA-Z0-9-]+).html$ index.php?id=$3&parent=$1 [L]

它像这样很棒。

现在我想在我的网站上添加一些语言,我希望它能以这种方式工作:

  • 用户达到http://www.example.com我检查是语言,并根据它重定向:
    • 法语:您留在http://www.example.com
    • 英语:您移至http://www.example.com/en
    • 我的DB中没有现有语言:您转到http://www.example.com/en

那么我的URL看起来像:

  • http://www.example.com/2-news.htmlindex.php?lang=fr&id=2&parent=0
  • http://www.example.com/en/2-news.htmlindex.php?lang=en&id=2&parent=0

,因此http://www.example.com/2-news_1-news-title.html将是index.php?lang=fr&id=1&parent=2http://www.example.com/en/2-news_1-news-title.htmlindex.php?lang=en&id=1&parent=2

我做了这个

RewriteCond %{HTTP:Accept-Language} ^(fr|en) [NC]
RewriteRule ^$ %1 [L]
RewriteRule ^$ en [L]
RewriteRule ^(fr|en)$ index.php?lang=$1&id=$2&parent=0 [L,NC,QSA]
# Level 1
RewriteRule ^(fr|en)/([0-9]*)-([a-zA-Z-]*).html$ index.php?lang=$1&id=$2&parent=0 [L,NC,QSA]
# Level 2
RewriteRule ^(fr|en)/([0-9]*)-([a-zA-Z-]*)_([0-9]+)-([a-zA-Z0-9-]+).html$ index.php?lang=$1&id=$4&parent=$2 [L]

它的效果很好,但并不像我预期的那样。对于法语,这应该是我网站的根源,如果我以前不添加fr/,其他链接将无法正常工作。 http://www.example.com/fr/2-news.html工作时http://www.example.com/2-news.html不会。

任何帮助将不胜感激。

欢呼

首先,在您的规则上,RewriteRule ^$ en [L]无需做任何事情,它已经由以前的规则RewriteRule ^$ %1 [L]完成,然后您应该分开fr & en规则以实现您在寻找这样的东西:

RewriteCond %{HTTP:Accept-Language} ^(fr|en) [NC]
RewriteRule ^$ %1 [L]

RewriteRule ^(en)$  index.php?lang=$1&id=$2&parent=0 [L,NC,QSA]
RewriteRule ^(en)/([0-9]*)-([a-zA-Z-]*).html$ index.php?lang=$1&id=$2&parent=0 [L,NC,QSA]
RewriteRule ^(en)/([0-9]*)-([a-zA-Z-]*)_([0-9]+)-([a-zA-Z0-9-]+).html$ index.php?lang=$1&id=$4&parent=$2 [L]
RewriteRule ^(fr)?$  index.php?lang=fr&id=$2&parent=0 [L,NC,QSA]
RewriteRule ^(fr)?/?([0-9]*)-([a-zA-Z-]*).html$ index.php?lang=fr&id=$2&parent=0 [L,NC,QSA]
RewriteRule ^(fr)?/?([0-9]*)-([a-zA-Z-]*)_([0-9]+)-([a-zA-Z0-9-]+).html$ index.php?lang=fr&id=$4&parent=$2 [L]

当您的客户在每个HTTP请求中发送它时,检查Accept-language标头非常有用。因为我不确定您的设置环境,所以这是您的第一个规则,它被转换为两个规则以应用语言slug(订单可能很重要(:

RewriteRule ^(fr|en|es)/([0-9]+)-[a-zA-Z-]+.html$ index.php?lang=$1&id=$2&parent=0 [L]
RewriteRule ^([0-9]+)-[a-zA-Z-]+.html$ index.php?lang=fr&id=$1&parent=0 [L]

最新更新