【问题标题】:SEO mod_rewrite internal uri directory problemsSEO mod_rewrite 内部 uri 目录问题
【发布时间】:2012-02-11 04:07:27
【问题描述】:

我有一个 mod_rewrite 规则,将 example.com/en/about/topic 更改为 example.com/en/view.php?p=pages/about/topic.php

我的规则是:

RewriteRule ^en/([a-zA-Z0-9/]+)$ en/view.php?p=pages/$1.php

view.php 包含我所有的持久性内容,例如菜单、徽标等,它使用 php 包含来获取 pages/topic.php

它适用于example.com/en/topic -> example.com/en/view.php?p=pages/topic.php,但是当我尝试example.com/en/about/topic -> example.com/en/view.php?p=pages/about/topic.php 时,它会找到view.phppages/about/topic.php 并加载它们,但尝试从en/about/... 而不是en/... 加载我所有的css 文件和图像等它对 view.php 和 topic.php 中的图像执行此操作。最令人沮丧的是,如果我在规则中添加 [R],一切正常,但它违背了 SEO 练习的目的!

我整天都在这,但没有运气。虽然我确实发现了 mod_rewrite 日志记录和几个 handy guides

这是我的日志中针对 example.com/en/test 的内容(有效):

[perdir C:/tt/xampp/htdocs/] 重写 'en/test' -> 'zh/view.php?p=pages/test.php'

[perdir C:/tt/xampp/htdocs/] 去除 document_root 前缀: C:/tt/xampp/htdocs/en/view.php -> /en/view.php

[perdir C:/tt/xampp/htdocs/] 内部重定向与 /en/view.php [内部重定向]

[perdir C:/tt/xampp/htdocs/] 通过 C:/tt/xampp/htdocs/en/view.php

[perdir C:/tt/xampp/htdocs/] 通过 C:/tt/xampp/htdocs/en/base/code/view.css

例如.com/en/about/test(没有)

[perdir C:/tt/xampp/htdocs/] 重写 'en/about/dir/test' -> 'en/view.php?p=pages/about/dir/test.php'

[perdir C:/tt/xampp/htdocs/] 去除 document_root 前缀: C:/tt/xampp/htdocs/en/view.php -> /en/view.php

[perdir C:/tt/xampp/htdocs/] 内部重定向与 /en/view.php [内部重定向]

[perdir C:/tt/xampp/htdocs/] 通过 C:/tt/xampp/htdocs/en/view.php

[perdir C:/tt/xampp/htdocs/] 通过C:/tt/xampp/htdocs/en/about

任何帮助将不胜感激!

【问题讨论】:

  • 哦,我只是想 - 我知道我可以将我的图片网址等更改为绝对网址,但我真的不想(很多文件!)

标签: html regex .htaccess mod-rewrite seo


【解决方案1】:

在某种程度上你问错了问题。你给出的规则是有效的,做你想做的。您的问题是脚本正在为您的 CSS、图像等发出相对地址,因此当客户端浏览器请求包含相对链接 href="base/code/view.css"example.com/en/about/topic 时,客户端会将其转换为

example.com/en/about/base/code/view.css

鉴于您不想更改脚本,因此您面临的挑战是识别这种类型的模式并去除 SEO 编码引入的无关目录,因此如果这种情况是 example.com/en/<don't care>/base/code/...,那么以下类型的规则会做你想做的事

RewriteRule en/.+?/base/code/(.*) en/base/code/$1   [L]

用您需要的任何匹配模式替换 /base/code

【讨论】:

  • 太棒了!谢谢!这很有意义。我没有意识到客户端仍然基于输入的地址,而不是修改后的地址。这也解释了为什么所有的 php 仍然在服务器端工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-21
  • 1970-01-01
  • 2010-09-16
相关资源
最近更新 更多