Проблема:HTAccess 404 ошибка не работает должным образом
Запрошенный URL /welcome.php не был найден на этом сервере.
Кроме того, при попытке использовать ErrorDocument для обработки запроса была обнаружена ошибка 404 Not Found.
Вот он идет:
Когда я иду в www.mysite.com/page он отлично работает, он также работает, если я иду в mysite.com/404
Но , когда я что-то пропустил и перейду на сайт www.mysite.com/pag (вместо страницы), я получу вышеуказанную ошибку.
Я также использую PHP в моем индексный файл (welcome.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 ошибки:
Внутренняя ошибка сервера
Сервер столкнулся внутренняя ошибка или неправильная конфигурация и не удалось выполнить ваш запрос.
Обратитесь к администратору сервера [email protected] и сообщите им о времени, в котором произошла ошибка, и все, что вы могли бы сделать, что могло привести к ошибке.
Дополнительная информация об этой ошибке может быть доступна в журнале ошибок сервера.
Кроме того, при попытке использовать 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
он отображает сообщение об ошибке о том, что он не может найти как мой индекс (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 должен интерпретировать как значение $_GET
для моей /welcome.php
страницы, которая работает, когда значение $_GET
является реальная ценность, но когда это не так, она возвращается как ошибка и отбрасывает все.
Проблема даже не документ об ошибке на данный момент, это то, что он не может найти /welcome.php
и /404
когда адрес читается как файловая система с неправильными $_GET
значениями ... Это не пытается найти /abou/welcome.php
, потому что есть расширение файла и будет в конечном счете брошено на настоящую 404 страницу, и он не пытается перейти на /abou/404
, потому что в моем файле .htaccess я предоставил полный путь к моей странице 404 по адресу http://mrobertsdesign.ca/404
. Здесь я потерялся.
- Как StackOverflow добиться того, что он делает с ней это .htaccess файл, в котором вы можете удалить часть URL, и он будет пытаться либо заполнить его с ближайшим напоминающей URL или бросить страницу 404 ошибки?
Ответ!
Как @Phil_1984_
говорилось, следующая строка была конфликтует с ErrorDocument
запрос, который вызвал 404 не найдена ошибка моей /welcome.php
страницы и ErrorDocument
сам запрос:
else {
$page = 'home';
$url = '/' . $page;
}
Его первоначальная идея была, чтобы изменить линию к следующему:
else {
http_response_code(404); exit;
}
Что заставило меня думать, у меня уже есть динамическая настройка макета, я могу просто вернуть $_GET
на странице вместо того, чтобы переадресовывать всю страницу на страницу 404, - что, как оказалось, вызывает проблему.
Решение было, вместо того чтобы пытаться перенаправить всю страницу (технически обратно на себя, так как весь сайт создан из этого скрипта PHP и ряд включений) на страницу 404, чтобы просто повернуть значение $_GET
вернуться к $path
, чтобы файл include include('includes/' . $path . '.php');
прочитал его и просто включил документ 404 на страницу (так как это было бы сделано любым способом, разница только в том, что URL-адрес не изменяется).
else {
$page = '404';
$path = 'content_' . $page;
}
Возможно, вы можете использовать некоторые правила правил LL (** L ** ast). См. Http://httpd.apache.org/docs/current/rewrite/flags.html#flag_l – Phil
Я считаю, что вы хотите, чтобы ваш ErrorDocument ссылался на файл в контексте вашей файловой системы. –
@ JoshuaChavanne да, хотя это страница 404,/404 такая же, как /welcome.php?page=404 – Matthew