2014-12-17 13 views
3

Проблема: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; 
    } 
+2

Возможно, вы можете использовать некоторые правила правил LL (** L ** ast). См. Http://httpd.apache.org/docs/current/rewrite/flags.html#flag_l – Phil

+1

Я считаю, что вы хотите, чтобы ваш ErrorDocument ссылался на файл в контексте вашей файловой системы. –

+0

@ JoshuaChavanne да, хотя это страница 404,/404 такая же, как /welcome.php?page=404 – Matthew

ответ

0

Ответ!

Как @Phil_1984_ говорилось, следующая строка была конфликтует с ErrorDocument запрос, который вызвал 404 не найдена ошибка моей /welcome.php страницы и 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; 
    } 
2

От Apache Docs:

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

Убедитесь, что путь является правильным и AllowOverride включен.

+0

Я верю, что пути верны, это прямая ссылка на страницу 404, которая работает, когда я иду к ней напрямую, только когда htaccess ее ищет - это то же самое с моим индексным файлом (welcome.php), он работает, он не может найти его, когда значение GET «/welcome.php?page=» не является реальной страницей. Когда я удаляю все правила mod_rewrite, документ с ошибкой работает нормально! – Matthew

+0

Возможно, напишите правило в welcome.php, чтобы проверить переменную page get, и если эта страница не существует, отобразите сообщение или переадресуйте другой 404? –

+0

Не стесняйтесь показать некоторые источники для welcome.php - но я действительно думаю, что FallbackResource - это то, что вы ищете. Поскольку предполагается, что он использует welcome.php как резервный индекс каталогов, и если у вас нет способа обработки 404 в файле welcome.php, он по умолчанию имеет дело с файловой системой. https://httpd.apache.org/docs/current/mod/mod_dir.html#FallbackResource –

Смежные вопросы