如果内部重定向则停止重写

时间:2016-12-20 17:36:30

标签: apache .htaccess mod-rewrite

我当前的项目在项目根目录中使用具有公用文件夹和主入口点( index.php )的文件结构:

root/
  .htaccess
  index.php
  public/
    style.css

为了使其正常工作,我正在使用 .htaccess

RewriteCond %{DOCUMENT_ROOT}/public%{REQUEST_URI} -f
RewriteRule .* /public/$0 [END]

RewriteRule . index.php

这很好用,如果我访问[site]/style.css,它会正确加载。其他任何内容都转到 index.php

但是我需要在Apache 2.2下使用它,END标志不可用。如果我使用L

RewriteRule .* /public/$0 [L]

它停止工作,因为在下一次迭代中条件不再匹配,我最终再次使用 index.php 处理它。

如何模拟END的效果?我尝试在最终重定向之前添加一个后卫:

RewriteCond %{REQUEST_URI} !^/public/.+
RewriteRule . index.php

但是这允许访问[site]/public/style.css。我希望 index.php 重定向它以返回404.换句话说,如果URL已被前一条规则重写,我该如何防止重写?

1 个答案:

答案 0 :(得分:1)

您可以在Apache 2.2上使用这些规则:

DirectoryIndex index.php
RewriteEngine On

RewriteCond %{DOCUMENT_ROOT}/public%{REQUEST_URI} -f
RewriteRule .* public/$0 [L]

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule . index.php [L]

由于RewriteCond最后一条规则将仅在第一条规则尚未执行时执行,因为Apache在成功执行内部重写规则后将%{ENV:REDIRECT_STATUS}设置为200