我正在尝试使用以下任何一个示例构建一个可以从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]
感谢您的帮助,
文斯
答案 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]