.htaccess 和动态生成的 SEO 友好 URL

标签 .htaccess mod-rewrite seo dynamic-url

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

相关文章:

php - 重定向 *.php 到干净的 URL

redirect - 使用 mod_rewrite 进行通配符子域重定向

.htaccess - 重定向所有以 https ://to same URLs starting with http://开头的 URL

php - 使用 htaccess 文件的多种语言的友好 php URL(从 URL 检测语言)

html - 如果 <h1> 中的内容始终保持不变而 <h2> 根据文章而变化,这对 SEO 是否合适?

.htaccess - 重写规则以重定向除一条路由之外的整个网站

.htaccess - .htaccess 中的 header 设置 Access-Control-Allow-Origin 不起作用

php - 在 PHP 中,测试是否定义了 Apache 变量(与 .htaccess 中的 IfDefine 相同)

seo - 防止搜索引擎索引路径中包含 3 个或更多 forwarslashes 的页面

seo - 如何让谷歌索引我的目录?