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

Raz*_*tax 5 php regex apache .htaccess mod-rewrite

我试图使用htaccess重写规则来映射多个GET变量,但不是所有变量都是必需的.我已经对变量进行了排序,以便始终需要x,如果设置了y,则必须设置z,等等.所以我需要映射看起来像这样:

example.com/section/topic/sub
Run Code Online (Sandbox Code Playgroud)

映射到

example.com/?x=section&z=topic&y=sub
Run Code Online (Sandbox Code Playgroud)

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

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>
Run Code Online (Sandbox Code Playgroud)

我还需要确保url 可以有尾随/但不需要它.

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

谢谢

anu*_*ava 12

  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>
Run Code Online (Sandbox Code Playgroud)

参考:Apache mod_rewrite简介