.htaccess 如何在mod_rewrite中设置可选参数

.htaccess 如何在mod_rewrite中设置可选参数,.htaccess,mod-rewrite,.htaccess,Mod Rewrite,我在一个新项目中,我正在设计URL结构, 问题是我希望URL看起来像这样: /category-23/关键字/5/ 其中,正常页面为: /search.php?q=keyword&cat=23&page=5 所以我的问题是,cat和page字段必须是可选的,我的意思是,如果我转到/关键字,它应该是可选的 /search.php?q=关键字(第1页) 如果我去 /category/keyword应该是: /search.php?q=keyword&cat=category&p=1 如果我去 /ke

我在一个新项目中,我正在设计URL结构, 问题是我希望URL看起来像这样:
/category-23/关键字/5/
其中,正常页面为:
/search.php?q=keyword&cat=23&page=5
所以我的问题是,cat和page字段必须是可选的,我的意思是,如果我转到
/关键字
,它应该是可选的
/search.php?q=关键字
(第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/图像文件无法加载。
我非常感谢能给我一个解决方案的人。

你可以通过四条规则来做到这一点,每种情况一条规则:

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]

现在您的最后一个问题,即无法找到外部链接的资源,是因为您可能正在使用相对URL路径,如
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路径

虽然我知道@Gumbo几个月前简洁地回答了这个问题,但我最近遇到了类似的问题。。。我不想在我的应用程序中包含完整/绝对路径,以保持它的动态性,而不是到处都有一堆应用程序路径(php)变量。。。所以我刚刚添加了一个带有 就像这样

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

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

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

非常感谢您的帮助Gumbo!最后,我的.htaccess是这样的:RewriteBase/RewriteCond%{SCRIPT_FILENAME}上的RewriteEngine-f RewriteCond%{SCRIPT_FILENAME}-重写规则^([^/]+)$search.php?q=$1重写规则^([^/]+)/([0-9]+)$search.php?q=$1&p=$2重写规则^([^/]+)/([^/]+)$search.php?q=$2&cat=$1&p=1重写规则^([^/]+)/([0-9]+)/$search.php?q=$2&cat=$1&p=$3