2013-04-20 66 views
0

我与Lighty的mod_rewrite模块有问题。Lighttpd的mod_rewrite模块

我试图做这个:example.com/index.php?search=whatever,出现example.com/whatever或example.com/search/whatever(还没有决定 - 不知道多少关于搜索引擎优化)

虽然我希望它像上面那样行事,但我也想排除所有的physichal目录和所有文件,例如目录/ 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" 

回答

1

为了避免必须添加大量的RewriteCond指令检查访问者的请求不是一个实际的文件,而不是人为的路径,我建议去机智h /search/whatever模式有利于/whatever模式。然后,只要你从不创建一个名为“search”的实际目录,你永远不需要检查以/search开头的路径是否是实际的文件路径。所以,你的重写规则变成这个简单:

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

(我不熟悉莱蒂,所以我不知道如何翻译成url.rewrite一次指令这一问题,但是就是这样一个简单的重写它应该是直截了当的。)

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

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

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

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

关于您对[a-zA-Z0-9_-]+.*之间差异的问题,第一种模式只允许字母a到z(小写或大写),数字,下划线和连字符。第二种模式允许任何字符。出于安全性和调试的原因,通常使用限制字符的模式只适用于那些应该允许的模式。所以我会选择这些模式中的第一个,如果需要添加额外的允许字符,而不是允许所有字符。

+0

好的,帮了很多!但是现在我发现了另一个问题。每当我用特殊字母搜索时,例如ö,ü,ï等等,它都不会起作用。我已经尝试为这样的所有字母添加\ p {L}: “^/search /([0-9 \ p {L} _-] +)”=>“/index.php?search= $ 1“ 但这根本没有帮助。顺便说一句,每当我搜索名称如“john example”时,它只搜索空间之前的任何内容。我试图用“john + example”,“john_example”和“john-example”来解决这个问题,但这些都没有。我在我的RewriteRule中丢失了什么? – AnonymousJ 2013-04-21 14:05:12

+0

虽然当我允许通过'。*'模式的所有字符,一切似乎工作正常。 – AnonymousJ 2013-04-21 14:29:24

+0

我对'\ p {L}'语法不熟悉,但是正则表达式确实提供了'\ w'单词字符类(它匹配字母,数字和非必要项)。所以你可以试试'([\ w + - ] +)'来允许单词字符,加号和连字符。您也可以在字符类中输入一个空格(但要确保文字连字符是方括号中的最后一个字符),但空格不会在原始URL中被允许,所以我不知道空格是否会比赛。 – Bobulous 2013-04-21 16:50:24