检测语言并保持当前的url架构

时间:2014-04-07 19:35:44

标签: php .htaccess rewrite iso

目前我的网站只有一种语言,

我实现了友好的网址v .a .htaccess,如:

RewriteRule ^post/(.+)/(.+) post.php?id=$2&friendly=1

所以:

domain.com是主页,domain.com/the-title/5是ID为5的帖子的页面。

现在我想将其作为默认语言网址,例如,下一语言将是:

domain.com/es是主页,domain.com/es/the-title/6是西班牙语ID为6的帖子的页面。 (但以前的规则也应该有效)

问题是,

我应该如何调整我的(或其他)重写规则以检查网址的第一个2个字符(第一个拆分)并将其添加为参数,例如:&lan=es如果找不到,则不要添加此参数?

让我们说:

^post/(.+)/(.+) post.php?id=$2&friendly=1(英文)

^es/post/(.+)/(.+) post.php?id=$2&friendly=1&lan=es(西班牙语)

但如果可行,

  • 只使用更多语言(如果需要,还可添加额外参数),
  • 只需使用其他规则,例如:

^es/photo/(.+)/(.+) photo.php?id=$2&friendly=1&lan=es(西班牙语)

有什么建议吗?

4 个答案:

答案 0 :(得分:2)

这样的事可能有用。我没有测试它,但您可以使用RewriteCond来检查uri的特定结构,如果匹配,请使用以下规则。如果没有,则继续执行原始规则。

#Does the uri match 2 characters followed by /post/?
RewriteCond %{REQUEST_URI} ^../post/
#then use this rule and stop processing rules
RewriteRule ^(..)/post/(.+)/(.+) post.php?id=$3&friendly=1&lan=$1 [L]

#Else use this rule
RewriteRule ^post/(.+)/(.+) post.php?id=$2&friendly=1&lan=en

编辑:我在第二条规则的末尾添加了一种默认语言。这样,始终存在$_GET['lan']参数。您可以将其关闭并在php中设置默认值。你的选择,没有区别。

答案 1 :(得分:2)

我只能通过建议回答你,因为我们需要更多的背景......

  1. 使用默认页面临时重定向(302)为默认语言或用户语言。
  2. 始终使用相同的方案从同一模式(http://mydomain.com/en/mypage.php
  3. 获取语言
  4. 如果您有大量公众或内容很多,请使用完整的语言代码,例如en_US,fr_FR,fr_CA ......
  5. 首选您的正则表达式中的否定搜索,以避免捕获以下字符,例如“之前/([^ /] +)/之后”,在某些情况下,这是强制性的。
  6. 如果您没有语言信息,则该用户不会来自有效网址,请将其重定向到包含语言信息(默认或用户语言)的网页。
  7. 如果用户使用直接php链接,请将其重定向到官方链接,以避免重复内容。您可以使用$ _SERVER ['REQUEST_URI']进行检查。
  8. 使用框架来管理它或至少使用一个基础来控制路径。
  9. 根据这些建议,您只能对您的所有网站使用以下重写规则:

    RewriteRule ^([^\/]+)/([^\.]+)\.([\.]+)$ index.php?lang=$1&route=$2&format=$3 [L,QSA]
    

    在这里我捕捉语言(es,en,en_US,fr ...),路线(post / 5,gotabeer,cats / postit / thumb / 2)和格式(html,json,jpeg ...... )。 (我没有尝试重写规则,但它应该有用)

答案 2 :(得分:1)

以下是我的建议:

RewriteRule ^/?((en|es)/)?post/(.+)/(.+)$ post.php?id=$4&friendly=1&lan=$2

/?允许字符串开头的可选正斜杠。这使得规则能够在htaccess目录联系人和httpd.conf服务器上下文

之间互换

((en|es)/)?允许选择性地指定两种可接受的语言代码之一。

请注意,我没有为语言部分建议使用通配符,因为我假设您只使用已知的语言子集,因此使用除已知语言代码之外的其他内容(或缺少整个内容)应该属于处理是其他规则(或者可能导致404)。

如果不是这种情况,您可以将正则表达式的第一部分从(en|es)更改为(.{2}),如果您预计只有两个字符,或者如果您希望也可以(.{2}(-.{2}))语言代码,如es-ES

答案 3 :(得分:0)

这应该适合你:

RewriteEngine On

RewriteRule ^([a-z]{2})/post/([^/]+)/([0-9]+)/?$ post.php?id=$3&friendly=1&lan=$1 [L,QSA]

RewriteRule ^post/([^/]+)/([0-9]+)/?$ post.php?id=$2&friendly=1&lan=en [L,QSA]