我正在尝试使用以下任一示例构建一个可以从 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]
感谢您的帮助,
文斯
最佳答案
导致循环的原因是您的正则表达式模式匹配 /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]
关于.htaccess 和动态生成的 SEO 友好 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16364738/