.htaccess检查两个位置的文件,否则抛出404

时间:2011-05-31 21:33:33

标签: .htaccess mod-rewrite rewrite

我的网站目前的结构方式,实际网站位于自己的单独文件夹中。这就是我的意思:

 /projects
 /files
 /pictures
 /tools
 /school
 /~webroot
 .htaccess

这使文件系统更易于管理和导航。一个简单的方法是利用这个,而不是让每个人都导航到http://domain.com/~webroot/,并且仍允许他们访问文件,例如http://domain.com/projects/,就是使用我在下面写的htaccess来检查文件在真正的根目录和~webroot目录中。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /~webroot/$1 [NC,QSA]
RewriteRule ^/?$ /~webroot/index.php [L,QSA]

但是,如果文件在任何地方都不存在(root或~webroot),则会抛出HTTP 500错误而不是HTTP 404.为了显示我的404错误页面,我必须使用这些行:< / p>

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/~webroot/$0 !-F
RewriteRule ^(.*)$ /404.shtml [B,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !^/~webroot
RewriteRule ^(.*)$ /~webroot/$1 [NC,QSA]
RewriteRule ^/?$ /~webroot/index.php [L,QSA]

这一切都相当凌乱,它只是一个技巧,并没有实际抛出HTTP 404,这使得我的统计应用程序不会记录404。有没有办法:检查文件是否存在于root中,如果没有检查~webroot中是否存在文件,如果没有抛出真正的HTTP 404错误?

我也正确定义了所有ErrorDocument

2 个答案:

答案 0 :(得分:4)

我知道这是不久前的事情,但是想要加入。对于重写规则达到404,我总是使用它:

RewriteRule ^(.*)$ - [R=404,L]

我不确定它是否正确,但它对我有用。我很确定应该始终使用“L”来防止进一步重写。

顺便说一句,什么是“B”标志?我只知道apache mod_rewrite页面上列出的那些,所以我迷失了它的含义。

http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html

编辑:啊,我的问题是我看旧版本的文档。谢谢你,Swivelgames。如果你没有指出那些(需要更新我的书签),我可能从来都不会知道我正在查看较旧的文档。

http://httpd.apache.org/docs/2.3/rewrite/flags.html#flag_b

答案 1 :(得分:0)

如果您可以将404页面设为PHP文件,则可以在任何输出之前添加此文件以获得真实的404页面:

<?php header("HTTP/1.1 404 Not Found"); ?>

这将导致PHP触发一个“真正的”404(从浏览器的角度来看),它将被传递回浏览器。如果您的统计数据包是服务器内部的,这种方法可能有效,也可能无效,我不确定。

我能想到的唯一其他解决方案是重定向到不存在的文件:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !/non-existent-404-generator
RewriteCond %{DOCUMENT_ROOT}/~webroot/$0 !-F
RewriteRule ^(.*)$ /non-existent-404-generator [B,L]