【问题标题】:Using MOD_REWRITE for URL variables and removing empty parameters when not used对 URL 变量使用 MOD_REWRITE 并在不使用时删除空参数
【发布时间】:2011-08-12 00:09:44
【问题描述】:

我正在尝试创建一个 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]

顺序总是相同的,所以这应该很容易。请问我怎样才能完成这项工作?

【问题讨论】:

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


    【解决方案1】:

    可能我错过了一些东西,但 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] 以确保存在无限循环。我还通过在每条规则的末尾添加 ? 使斜杠成为可选。

    以上所有规则在我的测试中都可以正常工作。

    【讨论】:

    • 谢谢。不过我需要修改。我需要它来处理 var2、var3 和 var4 的不同字段选项。能够做出 if-or-else 来选择哪个字段用于哪个变量并区分差异。例如,这里很容易区分每个变量的字段:www.example.com?page=var1&cat=var2&subcat=var3&subsubcat=var4 www.example.com?othervar1=var1&othervar2=var2&othervar3=var3&othervar4=var4 但对于:www。 example.com/var1/var2/var3/var4/ 此字符串需要能够使用 mod_rewrite 区分变量用于哪个字段。
    • 另外,你能告诉我开头的“-MultiViews”位是什么意思吗,因为我以前没有遇到过这个?
    • 我实际上已将此作为另一个问题发布,因为我之前无法回复。要回答这个新问题,请点击link。谢谢。
    • 当然我会去其他问题并在那里回答。同时,请您将此答案标记为已发布,因为此答案适用于此处发布的问题,并且适用于此特定问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-24
    • 1970-01-01
    • 1970-01-01
    • 2013-11-19
    • 1970-01-01
    • 2013-10-21
    相关资源
    最近更新 更多