0

那里,

对于任何知道的人来说,这都是一项简单的任务,但我是 Apache 重写的新手,所以请多多包涵。我写了 2 个重写条件,它们起作用了。我需要写第三个 - 以便其他所有内容都转到 index.php 文件。问题是 - 如果我添加第三条规则,尽管前两条规则总是适用。

RewriteEngine On 
RewriteRule   ^new/?$   new.php  [NC,L]
RewriteRule   ^thanks(.*)$ thankyou.php [NC,L]
RewriteRule   ^(.*)$ index.php 

感谢帮助。

4

1 回答 1

1

我相信答案在于以下关于与 RewriteRule 指令一起使用的L 标志的段落:

如果您在 .htaccess 文件或部分中使用 RewriteRule,那么了解规则的处理方式非常重要。其简化形式是,一旦处理了规则,重写的请求就会被交回 URL 解析引擎来做它可能做的事情。处理重写的请求时,可能会再次遇到 .htaccess 文件或部分,因此可能会从头开始再次运行规则集。最常见的情况是,如果其中一个规则导致重定向(内部或外部)导致请求过程重新开始。

我认为发生的情况是,在执行重写之后,以某种方式将控制权交还给 URL 解析引擎并再次运行规则。

您可以通过在最后一条规则中添加一些重写条件来防止这种行为:

<IfModule mod_rewrite.c>

RewriteEngine On 

RewriteRule new/?$ new.php [NC,L]
RewriteRule thanks(.*)$ thankyou.php [NC,L]

# Only rewrite to index.php if the current request is not for an existing file or directory
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L]

</IfModule>
于 2013-02-18T22:40:37.063 回答