【发布时间】: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&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