问题:
在此服务器上未find请求的url/welcome.php。
此外,尝试使用ErrorDocument处理请求时遇到404 Not Found错误。
这里是:
当我去www.mysite.com/page时,它工作正常,如果我去mysite.com/404也可以
但是,当我拼错一些东西,去www.mysite.com/pag(而不是'页面'),我会得到上述错误。
我也在我的索引文件(welcome.php)中使用PHP来确定$_GET
值并dynamic显示正确的页面。 这可能与此有关。
testing网站: 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&404错误页面,错误更改为内部服务器错误:
内部服务器错误
服务器遇到内部错误或configuration错误,无法完成您的请求。
请联系服务器pipe理员cgiadmin@yourhostingaccount.com,并通知他们错误发生的时间,以及可能导致错误的任何事情。
有关此错误的更多信息可能在服务器错误日志中可用。
此外,尝试使用ErrorDocument来处理请求时遇到500内部服务器错误错误。
更多信息,我已经观察到:
我的.htaccess文件正在将/welcome.php?page=about
这样的值重写到/about
和/welcome.php?category=about&page=me
到/about/me
,所以如果我去/about
它会转到about (现在没有/关于我或任何第二级页面)。
如果我拼错,去/abou
或/anything-here
或/anything-here/anything-here-too
它也显示错误,说它无法find我的索引(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.php
或/welcome.php?page=about
或/welcome.php?page=abo
),这个错误似乎被解决了(例如/about
和/about/me
)。
在/welcome.php?page=mypage
,地址字面上已经指向/welcome.php
,但是在/about
地址中只是一个文件系统,.htaccess文件应该解释为我的/welcome.php
的$_GET
值/welcome.php
页面,当$_GET
值是一个真正的值时工作,但是当它不是它会返回一个错误,并抛出一切。
这个问题甚至不是这个错误文件,而是当它的地址被读作一个带有不正确的$_GET
值的文件系统时,它找不到/welcome.php
和/404
…这不是试图find/abou/welcome.php
因为有一个文件扩展名,最终会被抛到真正的404页面,而不是试图去/abou/404
因为在我的.htaccess文件中,我提供了我的404页面的完整path在http://mrobertsdesign.ca/404
。 这是我迷路的地方。
答案!
正如@Phil_1984_
指出,下面的行与ErrorDocument
请求冲突,导致我的/welcome.php
页面和ErrorDocument
请求本身404找不到错误:
else { $page = 'home'; $url = '/' . $page; }
他最初的想法是改变线路如下:
else { http_response_code(404); exit; }
这让我想到,我已经有了dynamic的布局设置,我可以返回$_GET
值到页面,而不是试图将整个页面redirect到404页面 – 事实certificate是什么导致了这个问题。
该解决scheme是,而不是试图redirect整个页面(技术上,因为整个网站是由这个PHP脚本和一系列包括的一系列)redirect到404页面,只是把$_GET
的价值回到$path
包含文件include('includes/' . $path . '.php');
会阅读它,只是在页面中包含404文档(因为它将以任何方式进行,唯一的区别是url不会改变)。
else { $page = '404'; $path = 'content_' . $page; }
答案!
正如@Phil_1984_
指出,下面的行与ErrorDocument
请求冲突,导致我的/welcome.php
页面和ErrorDocument
请求本身404找不到错误:
else { $page = 'home'; $url = '/' . $page; }
他最初的想法是把这条线改为下面这条线,这对我来说不起作用(通过500错误):
else { http_response_code(404); exit; }
这让我想到,我已经有了动态的布局设置,我可以返回$_GET
值到页面,而不是试图将整个页面重定向到404页面 – 事实证明是什么导致了这个问题。
该解决方案是,而不是试图重定向整个页面(技术上,因为整个网站是由这个PHP脚本和一系列包括的一系列)重定向到404页面,只是把$_GET
的价值回到$path
包含文件include('includes/' . $path . '.php');
会阅读它,只是在页面中包含404文档(因为它将以任何方式进行,唯一的区别是url不会改变)。
else { $page = '404'; $path = 'content_' . $page; }