【问题标题】:HTACCESS 404 error not working properlyHTACCESS 404 错误无法正常工作
【发布时间】:2015-02-15 11:33:11
【问题描述】:

问题:

在此服务器上找不到请求的 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 和 404 错误页面的错误更改为内部服务器错误:

内部服务器错误

服务器遇到内部错误或配置错误,无法完成您的请求。
请联系服务器管理员 cgiadmin@yourhostingaccount.com 并告知他们错误发生的时间,以及您所做的任何可能导致错误的事情。
服务器错误日志中可能会提供有关此错误的更多信息。
此外,在尝试使用 ErrorDocument 处理请求时遇到 500 Internal Server Error 错误。


我观察到的更多信息:

  • 我的 .htaccess 文件正在重写值,例如 /welcome.php?page=about/about/welcome.php?category=about&amp;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 错误页面。

  • 1234563错误页面。 1234563如果您转到 404 错误页面,它也会在 /404 处正确显示。

当文件被视为文件系统(例如,/about/about.php/welcome.php?page=about/welcome.php?page=abo 相比)最多两个级别(例如 @987654348)时,该错误似乎被触发@ 和 /about/me)。

/welcome.php?page=mypage 中,地址实际上已经指向/welcome.php,但在/about 中,地址只是一个文件系统,.htaccess 文件应该将其解释为我的/welcome.php$_GET 值页面,当$_GET 值是一个真实值时有效,但当它不是一个错误时它会返回并抛出所有内容。

此时的问题甚至不是错误文档,而是当地址被读取为具有不正确$_GET 值的文件系统时,它找不到/welcome.php/404...不是试图找到/abou/welcome.php,因为有一个文件扩展名,最终会被扔到真正的404页面,而不是试图去/abou/404,因为在我的.htaccess文件中我提供了我的404页面的完整路径在http://mrobertsdesign.ca/404。这就是我迷路的地方。

  • stackoverflow 如何使用它的 .htaccess 文件实现它的功能,您可以在其中删除部分 url,它会尝试使用最接近的类似 url 填充它或抛出 404 错误页面?

答案!

正如@Phil_1984_ 所述,以下行与ErrorDocument 请求冲突,导致我的/welcome.php 页面和ErrorDocument 请求本身出现404 not found 错误:

    else {
        $page = 'home';
        $url = '/' . $page;
    }

他最初的想法是把这行改成如下:

    else {
        http_response_code(404); exit; 
    }

这让我想到,我已经有了动态布局设置,我可以将 $_GET 值返回到页面,而不是尝试将整个页面重定向到 404 页面 - 事实证明这是导致问题。

解决方案是,而不是尝试将整个页面(技术上回到自身,因为整个站点是由这个 PHP 脚本和一系列包含构建的)重定向到 404 页面,而只是将 @987654369 的值@ 回到 $path 以便包含文件 include('includes/' . $path . '.php'); 会读取它并将 404 文档包含到页面中(因为它会以任何方式执行,唯一的区别是 url 不会改变)。

    else {
        $page = '404';
        $path = 'content_' . $page;
    }

【问题讨论】:

  • 您可以使用一些 L (Last) 重写规则标志。见httpd.apache.org/docs/current/rewrite/flags.html#flag_l
  • 我相信您希望您的 ErrorDocument 引用文件系统上下文中的文件。
  • @JoshuaChavanne 是的,虽然那是 404 页面,但 /404 与 /welcome.php?page=404 相同
  • @Phil 我不太擅长这个 htaccess 的东西哈哈,我可以在哪里添加这些?如果您有时间帮助我,那就太好了
  • 这是一个很长的镜头,但您可以尝试将 welcome.php 文件的第 28 行更改为 http_response_code(404);出口;我认为当您从 php 发回 404 响应以及 404 页面的位置时,也许 apache 会感到困惑。

标签: php apache .htaccess mod-rewrite


【解决方案1】:

来自 Apache 文档:

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

确保路径正确并启用 AllowOverride。

【讨论】:

  • 我相信路径是正确的,它是指向 404 页面的直接链接,当我直接访问它时有效,而不是当 htaccess 正在寻找它时 - 它与我的索引文件相同(欢迎。当我删除所有 mod_rewrite 规则时,错误文档实际上可以正常工作!
  • 也许在welcome.php中写一条规则来检查页面获取变量,如果该“页面”不存在显示一条消息或重定向到其他404?
  • 请随意展示welcome.php 的一些来源——但我实际上认为FallbackResource 可能是您正在寻找的。因为它似乎假设它使用welcome.php 作为目录的后备索引,并且如果您没有在welcome.php 文件中处理404 的方法,它默认在文件系统上处理它。 httpd.apache.org/docs/current/mod/mod_dir.html#FallbackResource
  • 我已经添加了welcome.php的源代码,这是我的索引页面,但是错误中的第一行是The requested URL /welcome.php was not found on this server.,所以问题不可能是后备,这一切无需重写即可正常工作
  • 我想通了。感谢您的评论和帮助!
【解决方案2】:

答案!

正如@Phil_1984_ 所述,以下行与ErrorDocument 请求冲突,导致我的/welcome.php 页面和ErrorDocument 请求本身出现404 not found 错误:

    else {
        $page = 'home';
        $url = '/' . $page;
    }

他最初的想法是将行更改为以下内容,这对我不起作用(通过 500 错误):

    else {
        http_response_code(404); exit; 
    }

这让我想到,我已经有了动态布局设置,我可以将 $_GET 值返回到页面,而不是尝试将整个页面重定向到 404 页面 - 结果是导致问题。

解决方案是,而不是尝试将整个页面(技术上回到自身,因为整个站点是由这个 PHP 脚本和一系列包含构建的)重定向到 404 页面,而只是将 @987654328 的值@ 回到 $path 以便包含文件 include('includes/' . $path . '.php'); 会读取它并将 404 文档包含到页面中(因为它会以任何方式执行,唯一的区别是 url 不会改变)。

    else {
        $page = '404';
        $path = 'content_' . $page;
    }

【讨论】:

    猜你喜欢
    • 2019-03-13
    • 1970-01-01
    • 2013-01-08
    • 2012-02-19
    • 1970-01-01
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多