6

我正在尝试使用 htaccess 重写规则来映射多个 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>

我还需要确保 url可以有一个尾随 /,但不需要它。

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

谢谢你

4

2 回答 2

13
  1. 不知道RewriteCond %{REQUEST_URI} ([^/]+)/?在做什么。
  2. 通过使用使尾部斜杠可选/?$
  3. 在顶部检查文件/目录一次并跳过应用它们的规则。

你可以有这样的规则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 简介

于 2013-10-21T11:42:15.510 回答
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"
}

如果未在 URL 中设置,则该VALUE值为,如果已设置,则为该值。

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

例子

鉴于:

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) ""
}
于 2013-10-21T12:00:02.490 回答