Ошибка 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'); ?> в <?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 . Здесь я потерялся.

  • Как stackoverflow достигает того, что он делает с его файлом .htaccess, где вы можете удалить часть URL-адреса, и он попытается либо заполнить его ближайшим похожим URL-адресом, либо выбросить страницу с ошибкой 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; }