如何防止Apache在匹配后继续评估重写规则


How to prevent Apache from continuing to evaluate rewrite rules after a match?

我在根目录下的.htaccess文件中有以下重写规则:

[1]    AddDefaultCharset utf-8
[2]    SetEnv PHP_VER 5_4
[3]    RewriteEngine on
[4]    RewriteCond %{REQUEST_FILENAME} -d [OR]
[5]    RewriteCond %{REQUEST_FILENAME} -f
[6]    RewriteRule ^ - [L]      
    ...
[7]    RewriteRule ^'/de'/Artikel-Kategorie-([a-zA-Z,-_]+)'.html$ /art-cat.php?plng=de [L]
[8]    RewriteRule ^'/de'/Artikel-Alle-Kategorien'.html$ /art-cat.php?plng=de [L,QSA]
[9]    RewriteRule ^'/en'/Articles-([a-zA-Z,-_]+)'.html$ /art-cat.php?plng=en [L]
[10]    RewriteRule ^Articles-([a-zA-Z,-_]+)'.html$ art-cat.php?plng=fr [L]
[11]    RewriteRule ^'/de'/Artikel-([a-zA-Z,-_]+)'.html$ /art-item.php?plng=de&c=$1 [L,QSA]
[12]    RewriteRule ^'/en'/Article-([a-zA-Z,-_]+)'.html$ /art-item.php?plng=en&c=$1 [L]
[13]    RewriteRule ^Article-([a-zA-Z,-_]+)'.html$ art-item.php?plng=fr&c=$1 [L]
    ...

当请求URL http://dev.domain.com/de/Artikel-Alle-Kategorien.html时,应用的规则是行[11]中的规则,尽管行[8]中的规则是完全匹配的。结果是一个关于脚本art-item.php的错误消息列表,而art-cat.php应该被称为:

Notice: Undefined index: code in /Applications/MAMP/htdocs/site/dev/art-item.php on line 23
Notice: Undefined index: cat_id in /Applications/MAMP/htdocs/site/dev/art-item.php on line 24
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax ... 

我已经阅读了关于这个主题的几篇文章和其他问题,但我所尝试的似乎都不起作用。我怀疑这个问题在某种程度上与L标志有关,但我找不到适用于我的情况的解决方案。

我有点不知所措。谁能告诉我正确的方向?

您可以先跳过文件和目录的所有规则:

AddDefaultCharset utf-8
SetEnv PHP_VER 5_4
RewriteEngine On
# skip all files and directories from rewrite rules below
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ - [L]    
RewriteRule ^de/Artikel-Alle-Kategorien'.html$ art-cat.php?plng=de [L,QSA,NC]
RewriteRule ^de/Artikel-Kategorie-([a-z,_-]+)'.html$ art-cat.php?plng=de&c=$1 [L,QSA,NC]
RewriteRule ^en/Articles?-([a-z,_-]+)'.html$ art-cat.php?plng=en&c=$1 [L]
RewriteRule ^Articles?-([a-z,-_]+)'.html$ art-cat.php?plng=fr&c=$1 [L,QSA,NC]