问题:
在此服务器上找不到请求的URL /welcome.php 此外,尝试使用ErrorDocument处理请求时遇到404 Not Found错误。
这就是:
当我访问www.mysite.com/page它工作正常,如果我去mysite.com/404
但是,当我拼错并转到www.mysite.com/pag(而不是'page')时,我会收到上述错误。
我也在我的索引文件(welcome.php)中使用PHP来确定$_GET
值并动态显示正确的页面。它可能与此有关。
测试网站:http://mrobertsdesign.ca/home(您可以在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和amp;都会出现错误更改为内部服务器错误404错误页面:
内部服务器错误
服务器遇到内部错误或配置错误,无法完成您的请求 请联系服务器管理员cgiadmin@yourhostingaccount.com并告知他们错误发生的时间以及可能导致错误的任何操作。
服务器错误日志中可能提供了有关此错误的更多信息 此外,尝试使用ErrorDocument处理请求时遇到500内部服务器错误错误。
我观察到的更多信息:
我的.htaccess文件正在重写/welcome.php?page=about
到/about
和/welcome.php?category=about&page=me
到/about/me
的值,所以如果我转到/about
它将进入about页面(现在无论如何都没有/ about / me或任何第二级页面。)
如果我拼错了并转到/abou
或/anything-here
或/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
或/welcome.php?page=about
或/welcome.php?page=abo
相比),似乎会触发错误两个级别(例如/about
和/about/me
)。
在/welcome.php?page=mypage
中,地址字面上已经指向/welcome.php
,但在/about
中,地址只是.htaccess文件应该解释为{{1}的文件系统我的$_GET
页面的值,当/welcome.php
值是实数值时有效,但是当它不是它时,它会作为错误返回并抛出所有内容。
此问题甚至不是错误文档,当地址被读取为错误$_GET
的文件系统时,它无法找到/welcome.php
和/404
值...它不是试图找到$_GET
,因为有一个文件扩展名并且最终会被抛到真正的404页面,并且它不会尝试转到/abou/welcome.php
因为在我的.htaccess文件中已经在/abou/404
提供了我的404页面的完整路径。这就是我失去的地方。
答案!
如http://mrobertsdesign.ca/404
所述,以下行与@Phil_1984_
请求冲突,导致我的ErrorDocument
页面发现404未找到错误,/welcome.php
请求本身:< / p>
ErrorDocument
他最初的想法是将线路更改为以下内容:
else {
$page = 'home';
$url = '/' . $page;
}
让我思考的是,我已经拥有了动态布局设置,我只需将 else {
http_response_code(404); exit;
}
值返回到页面,而不是尝试将整个页面重定向到404页面 - 事实证明是造成这个问题。
解决方案是,而不是尝试重定向整个页面(技术上重新定位,因为整个站点由这个PHP脚本和一系列包含构建)到404页面,只需转换{{{ 1}}返回$_GET
以便包含文件$_GET
读取它并将404文档包含到页面中(因为它会以任何方式进行,唯一的区别是网址不会变化)。
$path
答案 0 :(得分:2)
答案 1 :(得分:0)
答案!
如@Phil_1984_
所述,以下行与ErrorDocument
请求冲突,导致我的/welcome.php
页面发现404未找到错误,ErrorDocument
请求本身:< / p>
else {
$page = 'home';
$url = '/' . $page;
}
他最初的想法是将线路更改为以下内容,这对我没有用(通过500错误):
else {
http_response_code(404); exit;
}
让我思考的是,我已经拥有了动态布局设置,我只需将$_GET
值返回到页面,而不是尝试将整个页面重定向到404页面 - 事实证明是造成这个问题。
解决方案是,而不是尝试重定向整个页面(技术上重新定位,因为整个站点由这个PHP脚本和一系列包含构建)到404页面,只需转换{{{ 1}}返回$_GET
以便包含文件$path
读取它并将404文档包含到页面中(因为它会以任何方式进行,唯一的区别是网址没有&#39} ; t改变)。
include('includes/' . $path . '.php');