【问题标题】:.htaccess and dynamically generated SEO friendly URLs.htaccess 和动态生成的 SEO 友好 URL
【发布时间】:2013-04-28 04:49:32
【问题描述】:

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

感谢您的帮助,

文斯

【问题讨论】:

  • 仅供参考:当我在 htaccess.madewithlove.be 上进行测试时,一切正常,但我在自己的服务器上进行测试时,我不断收到“500 内部服务器错误”。除非我从服务器上删除我的 .htaccess,否则我的域甚至不会提供任何其他参数。
  • 我在我的 htaccess 中添加了一个循环停止器,它似乎解决了我的问题,但我仍然不明白什么是循环。 RewriteCond %{ENV:REDIRECT_STATUS} 200 RewriteRule .* - [L]

标签: .htaccess mod-rewrite seo dynamic-url


【解决方案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]

【讨论】:

  • ty ty Jon,你救了我的理智。从这里开始的其他一切都归结为简单的 PHP 字符串解析,我对此没有任何问题。
猜你喜欢
  • 2017-02-13
  • 2015-10-13
  • 2013-02-03
  • 2016-03-21
  • 2015-04-17
  • 2011-05-29
  • 2013-01-22
  • 2010-12-24
  • 2011-05-09
相关资源
最近更新 更多