Возврат ответа HTTP 404 Вместо "Страница не найдена"

Главные вкладки

Аватар пользователя inspire inspire 21 мая 2012 в 12:28

Доброго дня всем.
Задумался над решением такой проблемы: в Drupal 7 при обращении к несуществующей странице, например www.domain.tld/production/not_exist выдается полноценная html-страница с кодом ответа HTTP 200 OK, а при дополнении к существующей ноде любого бредового суффикса, например, www.domain.tld/production/some_product/any_suffix, тем не менее, выдается страница some_product.
Возможно ли как-то заставить Drupal отдавать именно 404-ю ошибку?

Комментарии

Аватар пользователя inspire inspire 21 мая 2012 в 13:03

Так и дело-то в том, что вьюсами дело не ограничичвается. Есть модуль Fast 404, но он ограничивается подменой вывдоа друпала, HTTP-код, тем не менее, 200 ОК. А модулей, решающих вышеозначенную задачу я не нашел.

Аватар пользователя inspire inspire 21 мая 2012 в 14:31

RxB, этот модуль применим для Views, да и то, только для Drupal 6, а меня интересует ситуация не только с вьюсами, но и с нодами, причем для 7-й версии.

Аватар пользователя inspire inspire 24 мая 2012 в 12:46

Таких модулей я не нашел. Видимо, придется искать в коде где проверяется условие существования страниц. Если кто подскажет - буду признателен.

Аватар пользователя inspire inspire 24 мая 2012 в 14:56

Для несуществующих страниц решение придумал такое: в page.tpl.php в начале написал

<?php $current_path current_path();
            if (!
drupal_valid_path($current_path))
                
header("HTTP/1.0 404 Not Found");?>

Но, это решение не прокатывает, если дописывать суффикс вида www.domain.tld/node/10/SUFFIX - все равно, drupal_valid_path возвращает TRUE.

Аватар пользователя rimen rimen 4 июня 2012 в 10:03

Если поглядеть на функцию [api=drupal_deliver_html_page], то можно понять, что Drupal должен верно ставит заголовки сам.
Проверьте ответы Ваших страниц _http://mainspy.ru/otvet_servera или в Яндексе.

Ответ одной из 7-к по абракадабровому запросу.
HTTP/1.1 404 Not Found
Server: nginx
Date: Mon, 04 Jun 2012 05:45:58 GMT
Content-Type: text/html; charset=utf-8
Connection: keep-alive
Keep-Alive: timeout=20
X-Drupal-Cache: MISS
Expires: Sun, 19 Nov 1978 05:00:00 GMT
Last-Modified: Mon, 04 Jun 2012 05:45:58 +0000
Cache-Control: public, max-age=0
ETag: "1338788758-0"
Content-Language: ru
X-Generator: Drupal 7 (http://drupal.org)
Vary: Cookie,Accept-Encoding

Аватар пользователя inspire inspire 4 июня 2012 в 16:40

"rimen" wrote:
Проверьте ответы Ваших страниц _http://mainspy.ru/otvet_servera или в Яндексе.

Ну вот, к примеру, обращение к несуществующему (по идее) URL - www.domain.tld/node/10/SUFFIX (причем, www.domain.tld/node/10 реально существует)

HTTP/1.1 200 OK
Server: nginx/1.0.6
Date: Mon, 04 Jun 2012 12:35:56 GMT
Content-Type: text/html; charset=utf-8
Connection: keep-alive
X-Powered-By: PHP/5.2.10
Expires: Sun, 19 Nov 1978 05:00:00 GMT
Last-Modified: Mon, 04 Jun 2012 12:35:55 +0000
Cache-Control: no-cache, must-revalidate, post-check=0, pre-check=0
ETag: "1338813355"
Content-Language: ru
Link: ; rel="canonical",; rel="shortlink"
X-Generator: Drupal 7 (http://drupal.org)

Естественно, возвращается код 200, потому что сам друпал выводит страницу www.domain.tld/node/10, игнорируя все, что там дальше написано после слеша. Т.е. работают и www.domain.tld/node/10/SUFFIX и www.domain.tld/node/10/SUFFIX/QWERTY

Аватар пользователя rimen rimen 5 июня 2012 в 10:34

"inspire" wrote:
в Drupal 7 при обращении к несуществующей странице, например www.domain.tld/production/not_exist выдается полноценная html-страница с кодом ответа HTTP 200 OK, а при дополнении к существующей ноде...

вопрос в двух частях, мой ответ на первую - действительно несуществующие страницы отдаются корректно.
вторая - не такая уж и проблема ,если только не плодить такие "неправильные ссылки" руками.

Аватар пользователя inspire inspire 8 июня 2012 в 12:43

"rimen" wrote:
вторая - не такая уж и проблема ,если только не плодить такие "неправильные ссылки" руками.

Я-то их плодить не собираюсь, конечно )))
Это вопрос безопасности, скорее. Да и логичнее, на мой взгляд, так поступать.

Аватар пользователя DenisVS DenisVS 25 июня 2013 в 7:07

Актуально.
Раньше сайт был на Joomla, и проиндексировалась куча страниц вида /?page=13&option=com_virtuemart&category_id=1
Отдаётся 200, дублируя при этом страницу /?page=13
Смотрю лог, яндекс и гугл боты до сих пор дёргают старые URL наряду с новыми. Думал, время лечит, карта сайта, ан нет, год прошёл, а воз и ныне там. В результате, с такой кучей мусора неполная индексация нормальных страниц.
Надо как-то радикально решить, чтобы 301 отдавало. Или хотя бы 404.

Аватар пользователя rimen rimen 25 июня 2013 в 9:07

Смотри как работает модуль Global Redirect - например, он проверяет существование алиаса для системного пути и при необходимости отдает 301 на корректный путь. Воспользовавшись подходом и написав свой модуль, думаю, можно аналогично без проблем отдавать 404 когда нужно