如何在mod_rewrite中设置可选参数

ser*_*gip 3 .htaccess mod-rewrite

我在一个新项目,我正在设计URL结构,我希望URL看起来像这样: /category-23/keyword/5/ 正常页面是: /search.php?q=keyword&cat=23&page=5 所以我的问题是,catpage字段,必须是可选的,我的意思是,如果我去到/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]
Run Code Online (Sandbox Code Playgroud)

我无法使其工作,CSS /图像文件无法加载.我非常感谢能给我解决方案的人.

Gum*_*mbo 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
Run Code Online (Sandbox Code Playgroud)

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

RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^ - [L]
Run Code Online (Sandbox Code Playgroud)

现在你的最后一个问题是找不到外部链接的资源,这是因为你可能正在使用像css/style.css或那样的相对URL路径./css/style.css.这些相对引用从在引用中使用的文档的URL的URL路径的基本URL路径解决.所以,如果/category/keyword被请求时,就像一个相对引用css/style.css解析为/category/keyword/css/style.css,而不是/css/style.css.使用绝对URL路径/css/style.css使其独立于实际的基本URL路径