我有一个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 include来获取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.php
和pages/about/topic.php
并加载它们但会尝试加载我的所有css文件和图像等。 en/about/...
代替en/...
它为view.php和topic.php中的图像执行此操作。最令人沮丧的是,如果我将[R]添加到规则中,一切正常,但它会破坏SEO练习的目的!
我整天都在这,但没有运气。虽然我确实发现了mod_rewrite日志和一些handy guides。
以下是我的日志对example.com/en/test(有效)的说法:
[perdir C:/ tt / xampp / htdocs /]重写'en / test' - > 'EN / view.php P =页/ test.php的'
[perdir C:/ tt / xampp / htdocs /] strip document_root prefix: 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
和例如/en/about/test(没有)
[perdir C:/ tt / xampp / htdocs /]重写'en / about / dir / test' - > 'EN / view.php P =页/约/目录/ test.php的'
[perdir C:/ tt / xampp / htdocs /] strip document_root prefix: 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
非常感谢任何帮助!
答案 0 :(得分:0)
在某种程度上,你提出错误的问题。你给予的规则是有效的,也可以做你想要的。您的问题是脚本正在为您的CSS,图像等发布相对地址。因此,当客户端浏览器请求包含相对链接example.com/en/about/topic
的{{1}}时,客户端将将其转换为
href="base/code/view.css"
鉴于您不想更改脚本,因此您面临的挑战是识别这种类型的模式并删除SEO编码引入的无关目录,因此如果这种情况为example.com/en/about/base/code/view.css
,那么以下规则类型将做什么
example.com/en/<don't care>/base/code/...
将RewriteRule en/.+?/base/code/(.*) en/base/code/$1 [L]
替换为您需要的任何匹配模式。