htaccess针对不同GET变量的多个重写规则

时间:2013-10-21 11:35:32

标签: php regex apache .htaccess mod-rewrite

我正在尝试使用htaccess Rewrite Rules来映射多个GET变量,但并非所有变量都是必需的。我已经对变量进行了排序,以便始终需要x,如果设置了y,则必须设置z,等等。所以我需要映射看起来像这样:

example.com/section/topic/sub

映射到

example.com/?x=section&z=topic&y=sub

但是,以下代码会导致内部错误,但如果我只有一个重写规则,则可以正常工作。

Options +FollowSymLinks
Options -indexes
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI}  ([^/]+)/?   [NC]
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/([^/]+)$  ?x=$1&z=$2&y=$3&r=$4    [NC,L]
RewriteRule ^([^/]+)/([^/]+)/([^/]+)$  ?x=$1&z=$2&y=$3    [NC,L]
RewriteRule ^([^/]+)/([^/]+)$  ?x=$1&z=$2    [NC,L]
RewriteRule ^([^/]+)$  ?x=$1    [NC,L]

</IfModule>

我还需要确保网址可以有尾随/,但不需要它。

你可能会说,我是htaccess的新手。

谢谢

2 个答案:

答案 0 :(得分:12)

  1. 不知道RewriteCond %{REQUEST_URI} ([^/]+)/?正在做什么。
  2. 使用/?$
  3. 使尾随斜杠可选
  4. 在顶部检查一次文件/目录,然后跳过应用规则。
  5. 您可以在DOCUMENT_ROOT/.htaccess

    中获得这样的规则
    Options +FollowSymLinks -indexes
    <IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteBase /
    
    ## If the request is for a valid directory
    RewriteCond %{REQUEST_FILENAME} -d [OR]
    ## If the request is for a valid file
    RewriteCond %{REQUEST_FILENAME} -f [OR]
    ## If the request is for a valid link
    RewriteCond %{REQUEST_FILENAME} -l
    ## don't do anything
    RewriteRule ^ - [L]
    
    
    RewriteRule ^([^/]+)/([^/]+)/([^/]+)/([^/]+)/?$ ?x=$1&z=$2&y=$3&r=$4 [L,QSA]
    
    RewriteRule ^([^/]+)/([^/]+)/([^/]+)/?$ ?x=$1&z=$2&y=$3 [L,QSA]
    
    RewriteRule ^([^/]+)/([^/]+)/?$ ?x=$1&z=$2 [L,QSA]
    
    RewriteRule ^([^/]+)/?$ ?x=$1 [L,QSA]
    
    </IfModule>
    

    参考:Apache mod_rewrite Introduction

答案 1 :(得分:2)

看起来你要做一些只能在一条规则中实现的事情会遇到很多麻烦:

RewriteRule ^(.*)/*(.*)/*(.*)/*(.*)/*$ index.php?a=$1&b=$2&c=$3&d=$4

这将始终在PHP中返回类似的内容:

//var_dump($_GET);

array(4) {
  ["a"]=>
  string(#) "VALUE"
  ["b"]=>
  string(#) "VALUE"
  ["c"]=>
  string(#) "VALUE"
  ["d"]=>
  string(#) "VALUE"
}

VALUE如果未在网址中设置为空,或者如果设置了则值为

N.B。您可能还需要添加不是实际文件/目录的条件;取决于您的网站结构。

实施例

假设:

http://example.com/section/topic/sub

它转换为的URL将是:

http://example.com/index.php?a=section&b=topic&c=sub&d=

将在PHP中显示为:

//var_dump($_GET);

array(4) {
  ["a"]=>
  string(7) "section"
  ["b"]=>
  string(5) "topic"
  ["c"]=>
  string(3) "sub"
  ["d"]=>
  string(0) ""
}