2013-05-03 61 views
0

我想建立一个网站,可以从地址栏被称为具有以下任何一个例子:的.htaccess和动态生成SEO友好的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重写规则和代码,将安全处理我想参加,但全部落败的URL的动态性质。我已经读了近50个不同的网站,并且已经研究了近一周的时间,但我不知道我在做什么。我甚至不知道我是否应该使用RewriteCond。这是我在做一个重写规则我最后一次尝试:

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

感谢您的帮助,

文斯

+0

仅供参考:当我在http://htaccess.madewithlove.be/上测试这个事情没有问题,但后来我在自己的服务器上测试,我总是收到'500内部服务器错误'。除非我将我的.htaccess从服务器上删除,否则我的域名甚至不会提供其他参数。 – Vince 2013-05-03 18:11:44

+0

我在我的htaccess中添加了一个循环限制器,它似乎解决了我的问题,但我仍然不明白什么是循环。 RewriteCond%{ENV:REDIRECT_STATUS} 200 RewriteRule。* - [L] – Vince 2013-05-03 19:29:50

回答

1

是什么造成你的循环,你的正则表达式模式匹配/index.php。为什么?让我们一起来看看:

首先,前缀被剥离,因为这是在一个htaccess文件规则,所以第一个改写后的URI是:index.php(查询字符串分开)

您正则表达式的开头: ^(([a-z]{2})(-[a-z]{2})?),匹配in在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] 
+0

Jon ty,你救了我的理智。从这里的其他一切归结为简单的PHP字符串解析,我没有任何问题。 – Vince 2013-05-03 20:05:03