301 przekierowuje na stronę 404 lub ustaw kod stanu na 404 i pozostanie na stronie?

9

Mam w swojej witrynie wiele stron, do których dostęp mają tylko administratorzy, jeśli podana jest wartość zapytania, jeśli zostanie znaleziona i ustawiona poprawnie. Na przykład:

http://www.mydomain.com/show-daily-statistics?key=abc


Powyższy link pokaże zawartość strony, ale nic innego, jak na przykład poniżej, nie:

http://www.mydomain.com/show-daily-statistics


Teraz zastanawiałem się, co zrobić, jeśli wyszukiwarki i / lub użytkownicy niebędący administratorami w jakiś sposób wylądują na tych ukrytych stronach.

Mogę oczywiście zmienić kod strony na 404 lub przekierować 301 na:

http://www.mydomain.com/404-error


Jakie jest najlepsze rozwiązanie w odniesieniu do Google i SEO?

WPRookie82
źródło
6
Zastanowiłbym się zamiast tego nad wdrożeniem faktycznego uwierzytelnienia, jeśli informacje, które próbujesz ukryć, mają jakiekolwiek znaczenie. Poza tym przekierowanie 301 semantycznie wskazuje, że treść została przeniesiona, co nie ma miejsca w tym przypadku i dlatego jest to niewłaściwa odpowiedź.
Ty

Odpowiedzi:

11

Poprawny kod to 401 Brak autoryzacji

Zgodnie ze specyfikacjami HTTP

10.4.2 401 Niedozwolone

Żądanie wymaga uwierzytelnienia użytkownika. Odpowiedź MUSI zawierać pole nagłówka Uwierzytelnianie WWW (sekcja 14.47) zawierające wyzwanie mające zastosowanie do żądanego zasobu. Klient MOŻE powtórzyć żądanie z odpowiednim polem nagłówka Autoryzacja (sekcja 14.8). Jeśli żądanie zawierało już poświadczenia autoryzacji, wówczas odpowiedź 401 wskazuje, że odmówiono autoryzacji tych poświadczeń. Jeśli odpowiedź 401 zawiera to samo wyzwanie, co poprzednia odpowiedź, a agent użytkownika już próbował przynajmniej raz uwierzytelnić, wówczas POWINIEN przedstawić użytkownikowi jednostkę, która została podana w odpowiedzi, ponieważ jednostka ta może zawierać istotne informacje diagnostyczne. Uwierzytelnianie dostępu HTTP zostało wyjaśnione w „Uwierzytelnianie HTTP: Uwierzytelnianie dostępu podstawowego i szyfrowanego” [43].

lub alternatywnie

10.4.4 403 Zabronione

Serwer zrozumiał żądanie, ale odmawia jego spełnienia. Autoryzacja nie pomoże, a prośba NIE POWINNA zostać powtórzona. Jeśli metoda żądania nie była HEAD, a serwer chce podać do publicznej wiadomości, dlaczego żądanie nie zostało spełnione, POWINIEN opisać przyczynę odmowy w jednostce. Jeśli serwer nie chce udostępnić tych informacji klientowi, zamiast tego można użyć kodu stanu 404 (Nie znaleziono).

Oba są semantycznie bardziej poprawne niż 404. Zasób istnieje, więc 404nie jest „poprawny”. 401powinien być poprawny, ale nie wymaga uwierzytelnienia. Bezpieczeństwo przez zaciemnienie nie jest bezpieczeństwem. 403jest również poprawne, ponieważ żądanie jest zrozumiane, zasób istnieje, po prostu odmawia obsługi żądania. 404jest odpowiedni, jeśli nie chcesz ujawniać, dlaczego 403tak się dzieje.

W każdym razie 301przekierowania nie są odpowiednie, zasób nie został przeniesiony.


źródło
2
Google nie indeksuje i nie usuwa stron zwracających komunikaty o stanie 401/403, podobne pytanie zostało zadane jakiś czas temu. Alternatywnie zawsze możesz użyć prostego noindex i zablokować za pomocą robots.txt
Simon Hayter
1
@ WPRookie82 Informacje o ochronie strony poprzez zachowanie jej w tajemnicy - robisz to źle.
Cthulhu
4
bezpieczeństwo przez zaciemnienie wcale nie jest bezpieczeństwem
1
Wykorzystanie 401 do metod uwierzytelniania innych niż uwierzytelnianie podstawowe HTTP lub Digest (lub inne schematy uwierzytelniania zgodne z RFC2617) zostało tu wcześniej omówione ; moim zdaniem w tym czasie, w którym nadal stoję, jest to, że może działać w praktyce, ale nie jest tak naprawdę zgodne ze specyfikacją HTTP, i że w każdym razie preferowane byłoby 403 lub nawet 404.
Ilmari Karonen,
1
Zgadzam się z innymi komentarzami, że 401 Nieautoryzowane jest nieodpowiednie zgodnie ze specyfikacją HTTP.
Stephen Ostermiller
1

Ponieważ jest to strona dla administratorów, z parametrem „klucz” lub bez niego, strony nie mogą i nie powinny być indeksowane. Dlatego strona internetowa dla administratora może wysłać kod stanu 404 i możesz pozostawić ten sam adres URL nienaruszony. Nie przekierowuj, ponieważ poinformujesz Google, że strona została przeniesiona, ale następnie na stronę, która nie istnieje.

Tak też robi Google. Zobacz, co się stanie, gdy przejdziesz na fikcyjną stronę: http://www.google.com/analytics/asdsas

dm-facet
źródło
http://www.example.com/404-errorIstnieje jedna mała poprawka do mojego powyższego postu, jest to rodzaj globalnej strony 404 całej witryny, więc nie przekierowałem na stronę, która nie wychodzi.
WPRookie82,
@ WPRookie82: Jeśli chodzi o każdego oprócz ciebie i twojego serwera, nie ma różnicy między nieistniejącą stroną a istniejącą stroną, która zwraca odpowiedź 404.
Ilmari Karonen,
1

Semantycznie poprawny kod odpowiedzi HTTP dla tej sytuacji to 403 Zabronione :

Serwer zrozumiał żądanie, ale odmawia jego spełnienia. Autoryzacja nie pomoże, a prośba NIE POWINNA zostać powtórzona. Jeśli metoda żądania nie była HEAD, a serwer chce podać do publicznej wiadomości, dlaczego żądanie nie zostało spełnione, POWINIEN opisać przyczynę odmowy w jednostce. Jeśli serwer nie chce udostępnić tych informacji klientowi, zamiast tego można użyć kodu stanu 404 (Nie znaleziono).

(Chociaż definicja odpowiedzi 403 mówi, że „autoryzacja nie pomoże”, IMO należy rozumieć jako odnoszące się konkretnie do uwierzytelniania HTTP Basic / Digest , dla którego zamiast tego należy użyć kodu stanu 401 Nieautoryzowany . Ponieważ nie używasz jedną z tych metod uwierzytelniania, 403 jest odpowiednim kodem stanu w twoim przypadku).


Jednak przy użyciu kodu 403 ujawnia stanu (lub przynajmniej zdecydowanie wskazuje) fakt, że nie jest strona z tego adresu URL, nawet jeśli serwer odmawia go dostarczyć. Ponieważ jest to coś, co możesz ukryć przed potencjalnymi intruzami, standard HTTP / 1.1 wyraźnie zezwala zamiast tego na zwrócenie kodu stanu 404 Nie znaleziono ( moje wyróżnienie):

Serwer nie znalazł nic pasującego do URI żądania. Nie podano żadnych wskazówek, czy stan jest tymczasowy czy trwały. Kod statusu 410 (Zniknął) POWINIEN być użyty, jeśli serwer wie, poprzez jakiś wewnętrznie konfigurowalny mechanizm, że stary zasób jest trwale niedostępny i nie ma adresu przekierowania. Ten kod stanu jest powszechnie używany, gdy serwer nie chce dokładnie wyjaśnić, dlaczego żądanie zostało odrzucone, lub gdy żadna inna odpowiedź nie ma zastosowania.

Oczywiście, aby takie ukrywanie było w ogóle skuteczne, zwracana strona błędu 404 musi wyglądać identycznie jak zwracana w przypadku faktycznie nieistniejących stron. W przeciwnym razie oszukuje tylko najgłupszych i najbardziej przypadkowych napastników. (Jeśli Twoim celem jest po prostu utrzymanie stron poza indeksem Google, odpowiedź 403 również to zrobi).


Co z innymi możliwymi odpowiedziami sugerowanymi w twoim pytaniu i innymi odpowiedziami?

Jak zauważyłem wcześniej, nie sądzę, aby odpowiedź 401 była tutaj odpowiednia. To może działać w praktyce, o ile większość przeglądarek i wyszukiwarek będzie traktować każdą nieprawidłowy lub nierozpoznany 4 xx kod odpowiedzi seria jakby to było 404, ale wciąż nie jest ważne zgodnie z HTTP Spec, a tam nie ma praktycznego powodu, aby go preferują ponad 403 lub 404.

Jeśli chodzi o używanie przekierowania 301 (lub 302) na osobną stronę „błąd 404”, jest to okropna praktyka rozpowszechniana przez niechlujne samouczki mod_rewrite i nie ma absolutnie żadnych funkcji wykupujących w porównaniu do bezpośredniego zwracania odpowiedzi 404:

  • Jest to mylące dla odwiedzających, ponieważ adres URL, który próbowali odwiedzić, zostaje zastąpiony adresem URL strony błędu. Zatem widzą komunikat, że już osiągnął nieistniejącą stronę, ale nie łatwo widoczne wskazanie co strona starali się wizyty było, a więc nie można łatwo próbować żadnych strategii odzyskiwania jak mocowania żadnych oczywistych literówki w adresie URL, lub skopiuj i wklej go do Google lub Wayback Machine.

  • Może to mylić wyszukiwarki, szczególnie jeśli Twoja strona 404 jest niedozwolona w pliku robots.txt lub jeśli nieprawidłowo zwraca odpowiedź 200 OK zamiast prawdziwego kodu stanu 404 ( „miękki 404” ), potencjalnie powodując wyświetlenie strony 404 podczas wyszukiwania wyniki dla losowych wyszukiwanych haseł.

  • Powoduje to (niewielką ilość) dodatkowego obciążenia serwerów, wydłuża czas reakcji odwiedzających i potencjalnie spowalnia wyszukiwarki indeksujące Twoją witrynę, ponieważ każde żądanie nieistniejącej (lub ukrytej) strony wymaga teraz dodatkowej rundy HTTP wyjazd.

  • Nie przynosi to korzyści SEO, ponieważ i tak traci się „sok z linków” ze stron przekierowanych na stronę 404.

(Oczywiście, jedna sytuacja, gdzie zrobić chcesz użyć przekierowania 301 zamiast odpowiedzi 404 jest, gdy strona rzeczywiście został przeniesiony i można przekierować użytkownika do prawidłowej lokalizacji. Ale to nie jest przypadek omawiany tutaj).


Na koniec chciałbym powtórzyć zdanie wyrażone w wielu komentarzach tutaj, że zwykłe „ukrywanie” takich stron administracyjnych nie jest odpowiednim substytutem dla prawidłowego uwierzytelniania opartego na haśle . To powiedziawszy, jeśli masz już skonfigurowany bezpieczny system uwierzytelniania, ukrywanie stron może być przydatne jako dodatkowa warstwa, choć dość słaba, w podejściu do obrony .

Ilmari Karonen
źródło
W końcu postanowiłem wybrać to, co zasugerowałeś w drugiej części. Ktokolwiek znajdzie się na stronie bez ważnego klucza, zobaczy moją zwykłą stronę 404 i oczywiście zwracam w tym czasie kod statusu 404.
WPRookie82,
1

Użyłbym noindex,nofollow,noarchivetagu w nagłówku stron, które chcesz wyjść z wyszukiwania.

Przekonałem się, że noarchivetag ma cholernie szybkie wyjście z wyszukiwania, podczas gdy noindexmoże przestać go wyszukiwać, ale jeśli już tam jest, musisz go usunąć z wyników wyszukiwania.

Jeśli chodzi o pytanie dostępu administratora, inni faceci tutaj udzielili już porad dotyczących bezpieczeństwa, które poleciłbym sprawdzić.

Andrew Martin
źródło