Отдать 404 Not Found для адресов типа node/nid

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

Аватар пользователя XDmitry XDmitry 20 февраля 2013 в 13:22

При использовании синонимов, страница становится доступной по двум URL’ам. Чтобы избавиться от дублей типа node/ID (…node/3, node/4, node/5 …) можно использовать 301 редирект на соответствующие синонимы страниц. Но с практической стороны это смотрится некрасиво (имхо). Я решил избавиться от дублей типа node/ID, возвращая клиенту 404 ошибку на запрос, а не 301 редирект. В основу взял модуль mod_rewrite с правилом в .htaccess:

RewriteBase /
RewriteRule ^node/[0-9] - [R=410]

Все работает, но только для 410 ошибки, а для 404 такой код не работает. Кто решал подобную проблему или видит решение, поделитесь. Спасибо.

Комментарии

Аватар пользователя XDmitry XDmitry 20 февраля 2013 в 14:55

Закомментировал в .htaccess строку

ErrorDocument 404 /index.php

и все заработало:

RewriteBase /
RewriteRule ^node/[0-9] - [R=404,L]

Только, разумеется, вываливается стандартная страница 404 браузера, а не Друпаловская Sad

P.S. Значит будем делать свою страницу 404 и подставлять ее.

Аватар пользователя q2_faith q2_faith 20 февраля 2013 в 15:20

имхо, если человек через ПС попробует зайти на node/nid, то получит 404 и уйдет.
если человек с ПС зайдет на node/nid и через 301 редирект попадет на нужную страницу.
разницу чувствуете?

Аватар пользователя XDmitry XDmitry 20 февраля 2013 в 15:39

При разработке сайта (еще до первой индексации ПМ) выставлены синонимы страниц. Все node/nid имеют статус 404. Вопрос, зачем посетителю набирать несуществующий адрес типа node/nid? Или вы имеете в виду случай, когда в индексе уже лежат оба варианта URL?

Аватар пользователя q2_faith q2_faith 20 февраля 2013 в 16:01

"XDmitry" wrote:
Или вы имеете в виду случай, когда в индексе уже лежат оба варианта URL?

да. потом представьте следующую ситуацию, внутренняя ссылка с node/nid будет вести на 404?

Аватар пользователя XDmitry XDmitry 20 февраля 2013 в 16:15

Вот это уже серьезное замечание. Чтобы не трогать node/nid/edit поправил так:

RewriteBase /
RewriteRule ^node/[0-9]/?$ - [R=404,L]

плюс как-то так

RewriteRule ^node$|^node/$ - [R=404,L]

Аватар пользователя k_dmitry k_dmitry 20 февраля 2013 в 16:17

"XDmitry" wrote:
Но с практической стороны это смотрится некрасиво (имхо). Я решил избавиться от дублей типа node/ID, возвращая клиенту 404 ошибку на запрос, а не 301 редирект.

1. у вас все ссылки чпу?
2. Вы представляете сколько будет "битых" ссылок?
3. Вы знаете про существование globalredirect?
4. Вы уверены что поисковик не проиндексирует все страницы с node/id? и страниц с 404 ошибкой, не будет больше чем нормальных страниц?

Аватар пользователя q2_faith q2_faith 20 февраля 2013 в 16:22

"XDmitry" wrote:

на своем опыте скажу, с глобал_редирект. эти ссылки все равно попадают с индекс яндекса и гугла(больше яндекса). мое мнение, это происходит из за внутренних ссылок, в каких то местах используются, в каких не понятно. и использование 404 страницы это как жестко)

Аватар пользователя XDmitry XDmitry 20 февраля 2013 в 16:26

k_dmitry wrote:
"XDmitry" wrote:
Но с практической стороны это смотрится некрасиво (имхо). Я решил избавиться от дублей типа node/ID, возвращая клиенту 404 ошибку на запрос, а не 301 редирект.

1. у вас все ссылки чпу?
2. Вы представляете сколько будет "битых" ссылок?
3. Вы знаете про существование globalredirect?
4. Вы уверены что поисковик не проиндексирует все страницы с node/id? и страниц с 404 ошибкой, не будет больше чем нормальных страниц?

1) да
2) С чего они будут?
3) Знаю.
4) Во-первых, в robots.txt будет стоять запрет на node. Во-вторых, как ПМ найдет на сайте URL node/nid?

Аватар пользователя XDmitry XDmitry 20 февраля 2013 в 16:37

q2_faith wrote:
"XDmitry" wrote:

на своем опыте скажу, с глобал_редирект. эти ссылки все равно попадают с индекс яндекса и гугла(больше яндекса). мое мнение, это происходит из за внутренних ссылок, в каких то местах используются, в каких не понятно. и использование 404 страницы это как жестко)

Но я не использую глобал редирект. Как иначе они могут попасть в индекс ПМ?

Аватар пользователя XDmitry XDmitry 20 февраля 2013 в 16:50

"k_dmitry" wrote:
Может вы и правы... а как тогда с /node/1/edit или node/add/*?

Ну по правилу:

RewriteBase /
RewriteRule ^node/[0-9]/?$ - [R=404,L]
RewriteRule ^node$|^node/$ - [R=404,L]

проходят и node/1/edit и node/add
404 будет только по адресам:
node
node/
node/nid
node/nid/

Аватар пользователя k_dmitry k_dmitry 20 февраля 2013 в 17:18

Вот вам ответ на ваш вопрос:

"XDmitry" wrote:
RewriteBase /
RewriteRule ^node/[0-9]/?$ - [R=404,L]
RewriteRule ^node$|^node/$ - [R=404,L]

проходят и node/1/edit и node/add
404 будет только по адресам:
node
node/
node/nid
node/nid/

пишите в топике [решено]
Wink

Аватар пользователя XDmitry XDmitry 20 февраля 2013 в 17:26

Да хотелось бы решить эти тонкости на этапе разработки (может найдутся промахи). Пока я не увидел преград для такой реализации. Только вот придется повозится с 404 страницей - ее темизацией. Пока не получается подключить свою страницу на 404 по указанным правилам RewriteRule.

А решил я так сделать по той причине, что пока не увидел оправданности использования 301 редиректа с node на синоним страниц, на стадии разработки. Первый способ выявить Друпаловский движок сайта, где нет явных URL типа node/nid – это просто набрать .../node/"любая двухзначная комбинация чисел" и будет «301 Moved Permanently» и «200 OK». Не критично, но не красиво.

Аватар пользователя q2_faith q2_faith 20 февраля 2013 в 17:43

"XDmitry" wrote:
Да хотелось бы решить эти тонкости на этапе разработки (может найдутся промахи). Пока я не увидел преград для такой реализации. Только вот придется повозится с 404 страницей - ее темизацией. Пока не получается подключить свою страницу на 404 по указанным правилам RewriteRule.

/admin/config/system/site-information здесь пробовали назначать?

Аватар пользователя XDmitry XDmitry 20 февраля 2013 в 18:19

Кстати, в правиле нужно добавить плюсик: RewriteRule ^node/[0-9]+/?$ - [R=404,L]

"q2_faith" wrote:
/admin/config/system/site-information здесь пробовали назначать?

Пробовал. Дело в том, что там можно прописать только URL типа node/nid, а ведь она как-бы запрещена:) На любые комбинации типа http://example.ru/trulala12345 выводится 404 страница, указанная в /admin/config/system/site-information. А те, что проходят через правило RewriteRule (например node/) - получают стандартную 404 от браузера. Ведь для того, чтобы правила

RewriteBase /
RewriteRule ^node/[0-9]+/?$ - [R=404,L]
RewriteRule ^node$|^node/$ - [R=404,L]

работали, мне пришлось закомментировать строку ErrorDocument 404 /index.php. Вот и ломаю голову, как при этом сделать единую 404 страницу для всех 404 ошибок. Может правила RewriteRule как-то изменить...

Аватар пользователя XDmitry XDmitry 20 февраля 2013 в 23:56

Не получается приделать свою 404 страницу. Сейчас "тестировал" известные сайты на движке Drupal, и на запросы типа node/nid выдается кастомная страница с 404 ошибкой. Каким образом это реализовано?

Аватар пользователя Виктор Степаньков ака RxB Виктор Степаньк... 21 февраля 2013 в 0:55

"XDmitry" wrote:
Не получается приделать свою 404 страницу. Сейчас "тестировал" известные сайты на движке Drupal, и на запросы типа node/nid выдается кастомная страница с 404 ошибкой. Каким образом это реализовано?

Покажите эти известные сайты

Аватар пользователя XDmitry XDmitry 21 февраля 2013 в 1:27

"RxB" wrote:
Да вроде единая 404 что для ноде нид, что для dddddddddddddddddddddddddd

В том то и дело, что для всех вариантов одна страница 404. А у меня для node/nid 404 страница браузера, а для иных - друпаловская.

Аватар пользователя Виктор Степаньков ака RxB Виктор Степаньк... 21 февраля 2013 в 2:02

"XDmitry" wrote:

В том то и дело, что для всех вариантов одна страница 404. А у меня для node/nid 404 страница браузера, а для иных - друпаловская.


Вы же сами решили проблему в лоб, на что жаловаться то?
Пишите модуль, разруливайте там

Аватар пользователя XDmitry XDmitry 21 февраля 2013 в 11:29

Как-то так?

<?php
/**
* Implements hook_init().
*/
function MYMODULE_init() {
  if (
"условие на совпадение с node/nid...") {
    function 
drupal_add_http_header('Status''404 Not Found') {
      
//Что-то типа этого...
      
include('страница 404.php');
      exit;
    }
  }
}
?>