Проблема:
Запрошенный 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'); ?>
в<?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'); ?>
в<?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; }
Ошибка изменяется на внутреннюю ошибку сервера для страницы приветствия.php и 404:
Внутренняя ошибка сервера
Сервер обнаружил внутреннюю ошибку или неправильную конфигурацию и не смог выполнить ваш запрос.
Пожалуйста, свяжитесь с администратором сервера cgiadmin@yourhostingaccount.com и сообщите им о времени возникновения ошибки и о том, что вы, возможно, сделали, возможно, вызвали ошибку.
Дополнительная информация об этой ошибке может быть доступна в журнале ошибок сервера.
Кроме того, при попытке использовать ErrorDocument для обработки запроса была обнаружена ошибка 500 Internal Server Error.
Больше информации, которую я наблюдал:
Мой файл .htaccess переписывает значения, такие как /welcome.php?page=about
в /about
и /welcome.php?category=about&page=me
в /about/me
, поэтому, если я /welcome.php?category=about&page=me
к нему, он перейдет к (а также нет / о / мне или каком-либо втором уровне страниц сейчас все в порядке).
Если я пропущу это и перейду в /abou
или /anything-here
или /anything-here/anything-here-too
он отобразит ошибку, в которой говорится, что она не может найти мой индекс (welcome.php) и мою страницу ошибок 404.
Однако, если я /welcome.php?page=abo
в /welcome.php?page=abo
(вместо того, чтобы что-либо, что не является реальной страницей), он отображает мою страницу ошибок 404.
Если я /any-page.fileextention
в /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
. Здесь я потерялся.
Ответ!
Как указано в @Phil_1984_
, следующая строка противоречила запросу ErrorDocument
, что вызвало ошибку 404 не найденной для моей / /welcome.php
страницы и ErrorDocument
запроса 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; }
Из документов Apache:
https://httpd.apache.org/docs/2.2/custom-error.html
Убедитесь, что путь верен, а AllowOverride включен.
Ответ!
Как указано в @Phil_1984_
, следующая строка противоречила запросу ErrorDocument
, что вызвало ошибку 404 не найденной для моей / /welcome.php
страницы и ErrorDocument
запроса ErrorDocument
:
else { $page = 'home'; $url = '/' . $page; }
Его первоначальная идея состояла в том, чтобы изменить линию на следующую, что не сработало для меня (через ошибку 500):
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; }