将MOD_REWRITE用于URL变量并在不使用时删除空参数

时间:2011-04-24 20:57:04

标签: regex apache .htaccess mod-rewrite clean-urls

我正在尝试创建一个mod_rewrite,当用户输入或显示在URL中时:

www.example.com/var1/var2/var3/var4/

输出与

相同
www.example.com?page=var1&cat=var2&subcat=var3&subsubcat=var4

但如果数字变量发生变化,它仍然有效,因此变量可能是:

www.example.com/var1/
or
www.example.com/var1/var2/
or
www.example.com/var1/var2/var3/
or
www.example.com/var1/var2/var3/var4/

如果我使用以下内容,它仅适用于www.example.com/var1/var2/var3/var4/,但不适用于其他人:

Options +FollowSymLinks RewriteEngine On RewriteBase /

RewriteRule ^([^&]+)/([^&]*)/([^&]*)/([^&]*)/$ /?page=$1&cat=$2&subcat=$3&subsubcat=$4 [L]

如果我使用CHAINING使用以下代码,它在某种程度上可以作为链使用,但问题在于

www.example.com/var1/var2/
www.example.com/var1/var2/var3/
www.example.com/var1/var2/var3/var4/

它将VAR1输出为“/”,因此它使用以下代码忽略第一个变量:

Options +FollowSymLinks
RewriteEngine  On
RewriteBase /

RewriteRule ^([^&]+)/$ /?page=$1 [C]
RewriteRule ^([^&]+)/([^&]*)/$ /?page=$1&cat=$2 [C]
RewriteRule ^([^&]+)/([^&]*)/([^&]*)/$ /?page=$1&cat=$2&subcat=$3 [C]
RewriteRule ^([^&]+)/([^&]*)/([^&]*)/([^&]*)/$ /?page=$1&cat=$2&subcat=$3&subsubcat=$4 [L]

订单总是一样的,所以这应该很容易。我该怎么办呢?

1 个答案:

答案 0 :(得分:2)

可能我错过了一些东西,但IMO你不需要在这里链接C标志。请考虑以下规则:

RewriteEngine on
Options +FollowSymlinks -MultiViews

RewriteCond  %{QUERY_STRING} !^page= [NC]
RewriteRule ^([^/]+)/?$ /?page=$1 [L]

RewriteCond  %{QUERY_STRING} !^page= [NC]
RewriteRule ^([^/]+)/([^/]*)/?$ /?page=$1&cat=$2 [L]

RewriteCond  %{QUERY_STRING} !^page= [NC]
RewriteRule ^([^/]+)/([^/]*)/([^/]*)/?$ /?page=$1&cat=$2&subcat=$3 [L]

RewriteCond  %{QUERY_STRING} !^page= [NC]
RewriteRule ^([^/]+)/([^/]*)/([^/]*)/([^/]*)/?$ /?page=$1&cat=$2&subcat=$3&subsubcat=$4 [L]

我在所有规则中添加了RewriteCond %{QUERY_STRING} !^page= [NC]以确保存在无限循环。此外,我通过在每个规则的末尾添加?来使尾随斜杠成为可选项。

以上所有规则在我的测试中都运行良好。