我当前的项目在项目根目录中使用具有公用文件夹和主入口点( 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已被前一条规则重写,我该如何防止重写?
答案 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
。