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

.htaccess和动态生成的SEO友好URL,.htaccess,mod-rewrite,seo,dynamic-url,.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 这些页面请求需要点击my.htaccess模板,并最终转换为以下php调用: /index.ph

我正在尝试构建一个网站,可以通过以下任何一个示例从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
这些页面请求需要点击my.htaccess模板,并最终转换为以下php调用:

/index.php?lng=???&tpl=???
我一直在尝试制作RewriteCond和RewriteRule代码,这些代码将安全地处理我试图接受的URL的动态特性,但完全失败了。我已经阅读了近50个不同的网站,并为此工作了近一周,但我不知道我在做什么。我甚至不知道我是否应该使用重写器。这是我最后一次尝试自己制定重写规则:

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


Vince

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

首先,去掉前缀,因为这些是htaccess文件中的规则,所以第一次重写后的URI是:
index.php
(查询字符串是分开的)

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

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

您的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
在国家/地区代码后有一个
/
,或者根本没有,因此您需要考虑:

# 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]

仅供参考:当我在所有设备上进行测试时,都没有问题,但在我自己的服务器上进行测试时,我不断得到“500内部服务器错误”。我的域甚至不会出现任何附加参数,除非我从服务器上删除我的.htaccess。我在我的htaccess中添加了一个循环阻止器,它似乎已经解决了我的问题,但我仍然不明白什么是循环。重写cond%{ENV:REDIRECT_STATUS}200重写规则。*-[L]ty-Jon,你救了我的理智。这里的所有内容都归结为简单的PHP字符串解析,我对此没有任何问题。