我用下面的代码将所有请求重定向到我的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 =,但是有很多应用程序可以找到它(当然这是一种常见的用法)。