我的网站目前的结构方式,实际网站位于自己的单独文件夹中。这就是我的意思:
/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
。
答案 0 :(得分:4)
我知道这是不久前的事情,但是想要加入。对于重写规则达到404,我总是使用它:
RewriteRule ^(.*)$ - [R=404,L]
我不确定它是否正确,但它对我有用。我很确定应该始终使用“L”来防止进一步重写。
顺便说一句,什么是“B”标志?我只知道apache mod_rewrite页面上列出的那些,所以我迷失了它的含义。 编辑:啊,我的问题是我看旧版本的文档。谢谢你,Swivelgames。如果你没有指出那些(需要更新我的书签),我可能从来都不会知道我正在查看较旧的文档。答案 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]