如何在mod_rewrite中设置可选参数

时间:2010-10-13 20:00:27

标签: .htaccess mod-rewrite

我在一个新项目中,我正在设计URL结构, 问题是我希望URL看起来像这样: /category-23/keyword/5/ 正常页面是: /search.php?q=keyword&cat=23&page=5 所以我的问题是, cat page 字段,必须是可选的,我的意思是如果我去/keyword它应该是 /search.php?q=keyword(第1页) 如果我去 /category/keyword应该是: /search.php?q=keyword&cat=category&p=1 如果我去的话 /keyword/5/必须是:/search.php?q=keyword&p=5

现在我有这样的.htaccess:

RewriteEngine On
RewriteBase /
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^(.*)/(.*)/(.*)$ search.php?q=$2&cat=$1&page=$3 [L]

我无法使其工作且CSS /图像文件无法加载。 我非常感谢能给我一个解决方案。

3 个答案:

答案 0 :(得分:6)

您可以使用四个规则执行此操作,每种情况一个:

RewriteRule ^([^/]+)$ search.php?q=$1
RewriteRule ^([^/]+)/([0-9]+)$ search.php?q=$2&p=$1
RewriteRule ^([^/]+)/([^/]+)$ search.php?q=$2&cat=$1&p=1
RewriteRule ^([^/]+)/([^/]+)/([0-9]+)$ search.php?q=$2&cat=$1&p=$3

使用此规则在其他规则之前,任何可以映射到现有文件的请求都将通过:

RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^ - [L]

现在您的上一期,无法找到外部链接的资源,原因是您可能使用css/style.css./css/style.css等相对网址路径。这些相对引用是从基本URL路径解析的,该路径是使用引用的文档的URL的URL路径。因此,如果请求/category/keyword,则会将css/style.css之类的相对引用解析为/category/keyword/css/style.css而非/css/style.css。使用绝对URL路径/css/style.css使其独立于实际的基本URL路径

答案 1 :(得分:1)

虽然我知道几个月前@Gumbo已经简洁地回答了这个问题,但最近我遇到了类似的问题...并且我不想在我的应用中包含完整/绝对路径,以保持动态并且没有一堆APP_PATH(php)vars到处...所以我只是添加了一个base [href] html标签

喜欢这样......

<base href="http://<?php echo $_SERVER[HTTP_HOST];?><?php echo APP_PATH;?>"/>

希望能帮助别人......而且这并不是试图折扣@Gumbo的回复至少......他们是正确的:e-o on :)。

答案 2 :(得分:1)

不应该是

RewriteCond %{SCRIPT_FILENAME} -f
RewriteRule ^ - [L]

在@Gumbo上面的回答中?和我一起工作。如果文件(如CSS),请让它通过。