带有GET请求的mod_rewrite

时间:2010-06-02 16:35:32

标签: apache .htaccess mod-rewrite

我的mod_rewrite工作在我的大部分网站上。现在我有一个通常会指向

的搜索
search.php?keyword=KEYWORD

我正在尝试将其重写为

search/?keyword=KEYWORD

只是为了让它更清洁一点。所以这是我的mod_rewrite。 (还有其他规则我只是发布了一个不起作用的规则。)

RewriteRule ^search/?keyword=([^/\.]+)/?$ search.php?search=$1

当我在地址栏中输入我想要的搜索方式时,我得到一个页面告诉我它是一个“断开链接”(我猜这是Chrome相当于404错误)。那么我做错了什么?我认为问题是'='或'?'登录规则(第一部分),因为当我将?keyword = part取出时,它可以正常工作。这有意义吗?


编辑:这是我的完整.htaccess代码:

RewriteEngine on
RewriteRule ^$ index.php
RewriteRule ^thoughts$ archives.php 
RewriteRule ^thoughts/$ archives.php
RewriteRule ^about$ about.php 
RewriteRule ^about/$ about.php 
RewriteRule ^search/\?keyword=([^/]+)$ search.php?search=$1 
RewriteRule ^tags/([^/]+)$ tags.php?tag=$1
RewriteRule ^thoughts/([^/]+)$ post.php?title=$1 [L]

仍然收到错误页面...

2 个答案:

答案 0 :(得分:5)

如果你只想改造:

search.php?keyword=KEYWORD

成:

search/?keyword=KEYWORD

您需要做的就是:

RewriteRule ^search/$ search.php [QSA]

QSA标志表示“查询字符串追加”,并通过GET传递给search.php:

search/?keyword=KEYWORDD
search/?name=value&name2=value2    

您可能还想查看Apache MultiViews,它将每个/ foo请求发送到它在/目录中找到的任何foo。*文件,尽管它们是considered bad

答案 1 :(得分:1)

RewriteRule ^search/\?keyword=([^/.]+)/?$ search.php?search=$1

问号字符在正则表达式中具有特殊含义。你需要逃脱它。

此外,在字符类内部时,点没有特殊含义;你不需要逃避它(你要求该关键字不包含正斜杠和点)。