问题:
在此服务器上找不到请求的 URL /welcome.php。
此外,尝试使用 ErrorDocument 处理请求时遇到 404 Not Found 错误。
事情是这样的:
我还在我的索引文件 (welcome.php) 中使用 PHP 来确定$_GET
值并动态显示正确的页面。可能和这个有关系。
测试地点:http://mrobertsdesign.ca/home http://mrobertsdesign.ca/home(您可以在以下位置看到错误http://mrobertsdesign.ca/hom http://mrobertsdesign.ca/hom)
我到处寻找答案,在过去的 12 个小时里一直在研究这个问题,只是想找出为什么它不起作用。最重要的是,我不确定是什么导致了这个问题......感谢所有帮助!
有任何想法吗??
我的 .htaccess 文件是:
<Files .htaccess>
order allow,deny
deny from all
</Files>
ErrorDocument 404 http://mrobertsdesign.ca/404
Options +FollowSymLinks -MultiViews
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteCond %{HTTP_HOST} ^www\.mrobertsdesign\.ca [NC]
RewriteRule ^(.*)$ http://mrobertsdesign.ca/$1 [R=301]
RewriteRule ^([a-zA-Z0-9]+)/?$ welcome.php?page=$1 [NC]
RewriteRule ^([a-zA-Z0-9]+)/([a-zA-Z0-9]+)/?$ welcome.php?category=$1&page=$2 [NC]
DirectoryIndex comingsoon.php welcome.php
我的索引文件是(welcome.php):
<?php
$web_url = "http://mrobertsdesign.ca";
$path = '';
$page = $_GET['page'];
$pages = array('home','about','work','contact','404');
if ((basename($_SERVER['__FILE__'])) == 'welcome.php'){
if (!empty($page)) {
$url = '/' . $page;
} else {
$page = 'home';
$url = '/' . $page;
}
header('Location: ' . $url, true, 301); exit();
}
if (!empty($page)) {
if(in_array($page,$pages)) {
if (!empty($category)) {
$path = $category . '/' . $category . '_' . $page;
} else {
$path = 'content_' . $page;
}
}else {
$page = '404';
$url = '/' . $page;
header('Location: ' . $url, true, 404); exit();
}
}
else {
$page = 'home';
$path = 'content_' . $page;
}
if($page == 'home'){
// stuff for home here
}else if($page == 'about'){
$page_title = "About";
}else if($page == 'work'){
$page_title = "Work";
}else if($page == 'contact'){
$page_title = "Contact";
}else if($page == '404'){
$page_title = "Oops! (404)";
}
$page_class = 'page-' . $page;
// Page Start
include('includes/header.php');
include('includes/' . $path . '.php');
include('includes/footer.php');
?>
改变时:
else {
$page = 'home';
$url = '/' . $page;
}
对此:
else {
http_response_code(404); exit;
}
对于welcome.php 和 404 错误页面,错误均更改为内部服务器错误:
内部服务器错误
服务器遇到内部错误或配置错误,无法完成您的请求。
请联系服务器管理员,[电子邮件受保护] /cdn-cgi/l/email-protection并告知他们错误发生的时间,以及您可能执行的任何操作可能导致错误。
有关此错误的更多信息可在服务器错误日志中找到。
此外,尝试使用 ErrorDocument 处理请求时遇到 500 Internal Server Error 错误。
我观察到的更多信息:
我的 .htaccess 文件正在重写值,例如/welcome.php?page=about
to /about
and /welcome.php?category=about&page=me
to /about/me
,所以如果我去/about
它将转到“关于”页面(并且现在无论如何都没有 /about/me 或任何第二级页面)。
如果我拼写错误并转到/abou
or /anything-here
or /anything-here/anything-here-too
它显示错误,指出找不到我的索引 (welcome.php) 和 404 错误页面。
但是,如果我去/welcome.php?page=abo
(代替about
,任何不是真实页面的内容)它显示我的 404 错误页面。
如果我去/any-page.fileextention
(例如 /about.php - 实际上并不存在)它会显示 404 错误页面,如果我转到/one/two/three
它还会显示 404 错误页面。
如果你去/welcome.php
(我的索引页)它将显示正确的页面,如果您取出文件扩展名的一部分,例如/welcome.ph
它将显示 404 错误页面。如果您转到 404 错误页面,它也会正确显示在/404
.
当文件被视为文件系统时(例如,/about
相比/about.php
or /welcome.php?page=about
or /welcome.php?page=abo
)最多两个级别(例如/about
and /about/me
).
In /welcome.php?page=mypage
,地址实际上已经指向/welcome.php
, 但在/about
该地址只是一个文件系统,.htaccess 文件应该将其解释为$_GET
对我的价值/welcome.php
页面,当$_GET
value 是一个真实值,但是当它不是时,它会作为错误返回并丢弃所有内容。
此时的问题甚至不是错误文档,而是找不到/welcome.php
and /404
当地址被读取为不正确的文件系统时$_GET
价值观...它并不是试图寻找/abou/welcome.php
因为有一个文件扩展名,最终会被抛出到真正的404页面,并且它不会尝试去/abou/404
因为在我的 .htaccess 文件中,我提供了 404 页面的完整路径:http://mrobertsdesign.ca/404
。这就是我迷路的地方。
- stackoverflow 如何实现它在 .htaccess 文件中所做的事情,您可以在其中删除部分 url,它会尝试用最接近的相似 url 填充它或抛出 404 错误页面?
答案!
As @Phil_1984_
指出,以下行与ErrorDocument
请求,这导致我的 404 未找到错误/welcome.php
页面和ErrorDocument
请求本身:
else {
$page = 'home';
$url = '/' . $page;
}
他最初的想法是将这行代码更改为以下内容:
else {
http_response_code(404); exit;
}
这让我想到,我已经有了动态布局设置,我可以返回$_GET
值到页面,而不是尝试将整个页面重定向到 404 页面 - 事实证明,这就是导致问题的原因。
解决方案是,不要尝试将整个页面重定向到 404 页面(从技术上讲,因为整个站点是由这个 PHP 脚本和一系列包含构建的)到 404 页面,而是将$_GET
回到$path
这样包含文件include('includes/' . $path . '.php');
会读取它并将 404 文档包含到页面中(因为它会以任何方式执行,唯一的区别是 url 不会改变)。
else {
$page = '404';
$path = 'content_' . $page;
}