HTACCESS 404错误无法正常工作

问题:

在此服务器上未find请求的url/welcome.php。
此外,尝试使用ErrorDocument处理请求时遇到404 Not Found错误。

这里是:

我也在我的索引文件(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 。 这是我迷路的地方。

  • 如何实现它的.htaccess文件在哪里你可以删除部分url,它会尝试填充它与最接近的相似的url或抛出一个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; } 

从Apache文档:

https://httpd.apache.org/docs/2.2/custom-error.html

确保路径正确,AllowOverride已启用。

答案!

正如@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; }