0

我对 Lighty 的 mod_rewrite 模块有疑问。

我正在尝试这样做:example.com/index.php?search=whatever,显示为 example.com/whatever 或 example.com/search/whatever(尚未决定——对 SEO 不太了解)

虽然我希望它像上面那样运行,但我还想从重写中排除所有物理目录和所有文件,例如目录 /images/ 和文件 index.php、favicon.ico、style.css 等,因为它行为怪异。

我将如何实现这一目标?我尝试了以下方法,这对于我想要的效果很好,但在排除目录和文件时并没有真正起作用:

url.rewrite-once = (
"^/([a-zA-Z0-9_-]+)" => "/index.php?search=$1",
"^/(images|js|wp-content)/(.*)" => "$0",
"(.*\.php|.*\.css|favicon.ico)" => "$0" )

顺便说一句,这之间有什么区别:

"^/([a-zA-Z0-9_-]+)" => "/index.php?search=$1",

和这个:

"^/(.*)$" => "/index.php?search=$1"
4

1 回答 1

1

为了避免必须添加大量 RewriteCond 指令来检查访问者的请求不是实际文件而不是人工路径,我建议使用该/search/whatever模式以支持该/whatever模式。然后,只要您从不创建名为“search”的实际目录,您就永远不需要检查以 开头的路径是否/search是实际文件路径。所以你的 RewriteRule 变得这么简单:

RewriteRule ^/search/([a-zA-Z0-9_-]+)$ /index.php?search=$1

(我对 Lighty 不熟悉,所以我不确定如何将其转换为 url.rewrite-once 指令,但这是一个如此简单的重写,应该很简单。)

但是,访问者的浏览器现在会认为他们正在查看一个位于名为“搜索”的子目录中的页面,因此如果您有任何使用相对路径(未锚定到根目录的路径)指定的图像元素或 CSS 文件,例如或者然后浏览src="images/photo.jpg"href="stylesheets/clean.css"会认为这些路径是相对于“搜索”目录的,并会分别向您的网络服务器询问/search/images/photo.jpg/search/stylesheets/clean.css

有两种方法可以做到这一点。第一个是将所有页面装饰(图像、样式表、JavaScript)路径更改为绝对路径。也就是说,更改路径,使其以代表网站根目录的正斜杠开头。因此,您的图像路径需要更改为src="/images/photo.jpg",您的样式表路径需要更改为href="/stylesheets/clean.css". 开头的正斜杠告诉 Web 浏览器该路径从站点的根目录开始,因此没有歧义。

第二个选项是创建复杂的 RewriteRules 以将图像、样式表、脚本文件等的请求重定向到正确的目录。如果您在许多不同的目录中有许多媒体类型并且您需要它们从许多不同的子目录(虚拟和/或其他)工作,这往往会变得丑陋和脆弱。

您选择哪个选项取决于您的要求和偏好。

关于您关于[a-zA-Z0-9_-]+.*第一个模式之间的区别的问题,仅允许字母 a 到 z(小写或大写)、数字、下划线和连字符。第二种模式允许任何字符。出于安全和调试原因,通常最好使用将字符限制为仅应允许的字符的模式。所以我会使用第一个模式,如果需要,添加额外的允许字符,而不是允许所有字符。

于 2013-04-20T21:10:47.797 回答