【问题标题】:Handling language code in URL with htaccess. Redirect according to it使用 htaccess 处理 URL 中的语言代码。根据它重定向
【发布时间】:2018-03-28 12:59:40
【问题描述】:

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

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

# 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
    • 我的数据库中没有任何现有语言:您移至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.html 将是index.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 无效。

任何帮助将不胜感激。

干杯

【问题讨论】:

    标签: regex apache .htaccess redirect mod-rewrite


    【解决方案1】:

    首先在你的规则中,这条线 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]
    

    【讨论】:

    • 谢谢!现在完美运行。我只需要添加一个 PHP 函数,以确保我的所有链接都根据用户使用的语言具有良好的语言前缀。
    【解决方案2】:

    当您的客户端在每个 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]
    

    【讨论】:

    • 太棒了!在这一点上效果很好!谢谢你。我假设我的第二条规则如下所示: 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] 关于接受语言 我想将在浏览器中设置了法语或英语的任何用户重定向到 root 或 /en。现在,如果我将语言设置为英语并加载我的网站,则英语会加载到 root 而不是 root/en
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-21
    相关资源
    最近更新 更多