在一个非常简单的自定义PHP框架内自定义404错误页面


custom 404 error page within a very simple custom PHP framework

我用下面的代码将所有请求重定向到我的index.php:

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

我不能学习OOP,但我创建了一个非常简单和工作的自定义框架来管理来自访问者的url请求。逻辑是

if ( Is site under maintenance? )
{  
    display "under maintenance page" if answer is true;
}
else if ( if page exist physically or I know that url has a valid content )
{  
    display related content;
}
else
{
    display custom404.php
}

我知道.htaccess可以用于自定义404页面目标,但我要求学习。我也在这里和谷歌上搜索了一下,但找不到相关的文章。以下是我的三个问题。

q1

这种方法是否意味着"不会有真正的404错误页面"?(抱歉的是真正的术语,但希望你能理解。我找不到一个更好的词

q2

这种方法对搜索引擎机器人不利吗?

Q-3

这种方法是否有必须知道的不利因素?(我的意见是否定的,但我离专家还很远。)

Q1:这是一个很好的解决方案。如果需要,还应该返回404页头,并显示包含所需内容的页面:

<?php
header("HTTP/1.0 404 Not Found");
// here you display content you want

Q2:不,它没有。当然,如果因为任何原因你改变了你的网站结构,许多链接直接指向不存在的页面,你应该考虑为他们做301重定向到正确的页面,而不是显示404页面(这对用户和搜索引擎都有好处)

Q3:不,它不

这应该工作,但对于Q-2你应该包括一个404头(header("HTTP/1.0 404 Not Found");),使搜索引擎知道该页面不存在,他们不会爬到更深的URL

Q-1,因为你的。htaccess屏蔽了所有对index.php的请求,所以不会有服务器构建的404页面,这就是为什么你需要在你的自定义404页面上添加404标头。

Q-3我不认为这样做有任何问题。

我同意cavern和Marcin的观点,我唯一想补充的是安全考虑:使用这种方法,你应该非常小心地检查"页面是否物理存在"answers"加载相关内容之前",让我解释一下:如果使用file_get_contents检查和检索内容,攻击者可以执行

index.php?q=http://mr_bean_photo

他会得到你的网站污损。这也可以用来提交来自其他网站的池,或者像代理一样暴力攻击第三个网站登录:

index.php?q=http://anotherwebsite.com/login.php?user=admin&password=admin

然后请求第三页将从您的web服务器,所以要小心。

如果您通过fopen或类似的方式检查内容,请确保不能像这样包含本地文件系统:

index.php?q=/etc/passwd

这也可以用来检索私有证书密钥,所以也要小心。

攻击者当然应该知道你重定向到index.php?Q =,但是有很多应用程序可以找到它(当然这是一种常见的用法)。