2

我有一个我认为有效的 RewriteRule:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/(.*)$ index.php?lang=$1&page=$2
RewriteRule ^(.*)/editor/(.*)$ index.php?lang=$1&page=editor&func=$2

当我$_GET['lang']在第一级(仅限语言和页面)执行 a 时,它会返回语言。但是,如果我在第二级(语言、页面和函数)上尝试它,我会得到index.php.

我究竟做错了什么?谢谢!

4

1 回答 1

1

在第一次匹配后,您没有 [L]停止处理的标志,并且您的第二个规则也将与第一个匹配。由于它更具体,请先列出它,然后将[L]. (.*)此外,我建议不要贪婪,而是([^/]+)将所有内容匹配到下一个/

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# List this first, with [L]
RewriteRule ^([^/]+)/editor/(.*)$ index.php?lang=$1&page=editor&func=$2 [L]
# Then URIs not containing editor/ will match the other rule
RewriteRule ^([^/]+)/(.*)$ index.php?lang=$1&page=$2 [L]

如果 CSS 和图像失败,您可能需要移动规则RewriteCond下方的内容editor/,以确保条件仅适用于最不具体的、全面匹配的条件:

RewriteRule ^([^/]+)/editor/(.*)$ index.php?lang=$1&page=editor&func=$2 [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/(.*)$ index.php?lang=$1&page=$2 [L]
于 2013-06-18T20:27:35.757 回答