.htaccess和动态生成的SEO友好URL

时间:2013-05-03 17:42:01

标签: .htaccess mod-rewrite seo dynamic-url

我正在尝试使用以下任何一个示例构建一个可以从URL栏调用的网站:

domainname.com/en
domainname.com/zh-cn/
domainname.com/fr/page1
domainname.com/ru/dir1/page2
domainname.com/jp/dir1/page2/
domainname.com/es-mx/dir1/dir2/page3.html

这些页面请求需要点击我的.htaccess模板,最终转换成这个php调用:

/index.php?lng=???&tpl=???

我一直在尝试制作RewriteCond和RewriteRule代码,这些代码可以安全地处理我试图接受但完全失败的URL的动态特性。我已经阅读了近50个不同的网站,并且已经开展了近一个星期的工作,但我不知道我在做什么。我甚至不知道我是否应该使用RewriteCond。这是我自己制作RewriteRule的最后一次尝试:

RewriteRule ^(([a-z]{2})(-[a-z]{2})?)([a-z0-9-\./]*) /index.php?lng=$1&tpl=$4 [QSA,L,NC]

感谢您的帮助,

文斯

1 个答案:

答案 0 :(得分:1)

导致循环的原因是您的正则表达式匹配/index.php。为什么?我们来看看:

首先,前缀被剥离,因为这些是htaccess文件中的规则,因此第一次重写后的URI是:index.php(查询字符串是独立的)

正则表达式的开头:^(([a-z]{2})(-[a-z]{2})?),匹配URI中的in

正则表达式的下一位:([a-z0-9-\./]*)匹配dex.php。因此,规则匹配并再次应用 ,并将继续应用,直到达到内部递归限制。

您的网址结构:

domainname.com/en
domainname.com/zh-cn/
domainname.com/fr/page1
domainname.com/ru/dir1/page2
domainname.com/jp/dir1/page2/
domainname.com/es-mx/dir1/dir2/page3.html

国家/地区代码后面有/或者根本没有,所以您需要考虑到这一点:

# here -------------------v   
^(([a-z]{2})(-[a-z]{2})?)(/([a-z0-9-\./]*))?$
#      and an ending match here ------------^

你不需要改变其他任何东西:

RewriteRule ^(([a-z]{2})(-[a-z]{2})?)(/([a-z0-9-\./]*))?$ /index.php?lng=$1&tpl=$4 [QSA,L,NC]