【问题标题】:How to simulate [L] in .htaccess如何在 .htaccess 中模拟 [L]
【发布时间】:2011-01-14 08:35:04
【问题描述】:

我有一个包含许多 RewriteRules 的 .htaccess 文件。

我如何才能排除已经存在的文件和目录,使其不通过每个 RewriteCond / RewriteRule 对?

这个:

RewriteCond %{REQUEST_FILENAME} -f 
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule .*  - [F,L]  

不会可靠地工作,因为根据this SO question:

在 .htaccess 上下文中,[L] 不会强制 mod_rewrite 停止。它将继续触发内部子请求:

我怎样才能做到这一点? 或者,在 mod_rewrite 中是否有类似 if 条件适用,通过此规则块,否则跳过并转到 end 的控制结构?

【问题讨论】:

  • 应该在ServerFault上发布
  • 是的,我在上一个 mod_rewrite 问题时已经讨论过了。好吧,如果有五个人有这种感觉,那么如果你必须迁移它,但只要我们在这里回答 各种关于 SO 的 HTML 问题 太多,更少 与编程有关的任何 mod_rewrite 问题,我将继续在这里发布 mod_rewrite 问题。 (这里不会以任何方式攻击你@Steen。这只是需要在正确的场合下出来,恰好是这个问题。)
  • 干杯。很高兴给这个机会 :) 重要的是你的问题得到了回答,你似乎做到了。

标签: apache mod-rewrite


【解决方案1】:

您的规则的问题是不能同时满足这两个条件,因为常规文件 (-f) 也不能是目录 (-d)。试试这个:

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule .* - [L]

【讨论】:

  • (拍脑袋)当然。谢谢秋葵。我可以依靠[L] 在这种情况下工作,尽管引用是这样说的吗?
  • 应该没问题,您可以随时将 [NS] 标志添加到规则中(即 [L,NS]),这意味着忽略内部子请求。最好的方法是吸吮它,不幸的是,mod_rewrite 有点黑艺术:)
  • 奇怪。有谁知道为什么-d not 适用于以斜杠www.example.com/directory/ 请求的资源?
  • @Pekka:L 标志只会在 URI 更改时导致内部重定向。所以你的规则不会导致内部重定向。
  • 我有一个相关的问题,以防有人感兴趣:stackoverflow.com/questions/2218971/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-04
  • 2016-12-12
  • 2013-05-04
  • 1970-01-01
  • 1970-01-01
  • 2016-04-06
  • 1970-01-01
相关资源
最近更新 更多