【问题标题】:How to prevent Apache from continuing to evaluate rewrite rules after a match?如何防止 Apache 在匹配后继续评估重写规则?
【发布时间】:2015-09-20 07:22:19
【问题描述】:

我在根目录的 .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 标志有关,但我找不到适用于我的案例的解决方案。

我在这里有点不知所措。有人可以指出我正确的方向吗?

【问题讨论】:

  • 既然您已经对配置文件中的所有行进行了编号,您是否也可以在问题文本中引用这些行?我无法理解您所说的“第二个区块中的第一个”是什么意思。
  • 你是对的,对不起 :-) 完成。

标签: php apache .htaccess url-rewriting


【解决方案1】:

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

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]

【讨论】:

  • 我实施了您的建议,但似乎根本没有任何影响。你能解释一下它背后的逻辑是什么吗?
  • 刚刚添加了问题,以便包含您要求的元素。重新回复您回复中的评论行 - 抱歉,我对此不太擅长,恐怕我不明白您所说的“跳过所有文件和目录”是什么意思。
  • 我已将行号添加到 htaccess 提取以进行澄清。应该应用的规则在第 8 行,而应用的规则在第 11 行。我认为顺序是正确的。重新连字符,好的,谢谢,我会改正的。
  • 尝试了您建议的 .htaccess 解决方案,但不幸的是问题仍然存在
  • 很遗憾,对于 cmets 中的模糊信息无法提供进一步的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-23
  • 2020-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-24
相关资源
最近更新 更多