0

我正在尝试使用以下任一示例构建一个可以从 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]

谢谢你的帮助,

文斯

4

1 回答 1

1

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

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

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

正则表达式的下一点:([a-z0-9-\./]*)matches 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]
于 2013-05-03T19:38:22.823 回答