HTACCESS 404错误无法正常工作

时间:2014-12-17 01:08:12

标签: php apache .htaccess mod-rewrite

问题:

  

在此服务器上找不到请求的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页面的完整路径。这就是我失去的地方。

  • stackoverflow如何实现它正在使用它的.htaccess文件,你可以删除部分网址,它会尝试用最近的类似网址填充它或者抛出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

2 个答案:

答案 0 :(得分:2)

来自Apache Docs:

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

确保路径正确并启用了AllowOverride。

答案 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');