我对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"
答案 0 :(得分: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(小写或大写),数字,下划线和连字符。第二种模式允许任何字符。出于安全性和调试原因,通常最好使用将字符限制为仅允许的字符的模式。所以我会选择第一个模式,必要时添加其他允许的字符,而不是允许所有字符。