2010-03-15 9 views
25

Czy istnieje sposób aktywnej obsługi domyślnej, wbudowanej 404 strony serwera Apache dla wielu adresów URL za pomocą mod_rewrite? Nie jest to dokument niestandardowy błąd, ale reguła jakPrzekierowanie do wbudowanej strony 404 Apache z mod_rewrite?

RewriteCond %{REQUEST_URI} ^/dirname/pagename 
RewriteRule -- serve 404 page ----- 

wiem jak zbudować stronę PHP, który wysyła nagłówek 404 i mają mod_rewrite przekierować wszystkie adresy URL tam, ale wolałbym rozwiązanie, które jest oparte na mod_rewrite tylko .

miałem tylko ideę przekierowanie do nieistniejącego adresu:

RewriteCond %{REQUEST_URI} ^/dirname/pagename 
RewriteRule .* /sflkadsölfkasdfölkasdflökasdf 

ale które dają użytkownikowi wiadomość „/ sflkadsölfkasdfölkasdflökasdf nie istnieje” na stronę błędu, który wygląda trochę nieprofesjonalny.

+1

Wyborca ​​do zamykania: pytania mod_rewrite są oficjalnie w porządku na SO. http://meta.stackexchange.com/questions/39063/mod-rewrite-questions-getting-migrated-to-sf –

+2

+1 miłe pytanie! – richsage

Odpowiedz

39

Możesz użyć flagi R na RewriteRule wymusić przekierowanie z danym kodem stanu:

Chociaż jest to zwykle używane w przypadku przekierowań, tutaj można podać dowolny poprawny kod statusu. Jeśli kod stanu wykracza poza zakres przekierowania (300-399), łańcuch podstawiania zostanie usunięty, a przepisywanie zostanie zatrzymane, tak jakby użyto flagi L.

Więc tak:

RewriteRule ^/?page\.html$ - [R=404] 

wróci domyślną stronę 404 na /page.html. Ponieważ jest to wyrażenie regularne, pamiętaj, aby uchronić \. i zakotwiczyć $.

- jest zignorowany (tzn. "Usunięto łańcuch podstawiania"), ale nadal musi istnieć coś, co sprawi, że reguła będzie dobrze sformułowana.

+0

Mmm nie jestem pewien, czy spowodowałoby to domyślną stronę błędu, czyż nie? Ponieważ musiałbym wnieść jakąś wartość do "cokolwiek" i przekierowałoby to, prawda? Może się mylę, wypróbuję i zgłoś. –

+0

Nie, jak mówi cytat, ignoruje on łańcuch Substitution (tj. "Cokolwiek" w moim przykładzie). – mercator

+0

@mercator Oczywiście. Przepraszam, nie przeczytałem tego. –

1

To powinno działać:

RewriteEngine on 
RewriteRule ^/page.html /error404.html [L] 

Że nie da nagłówek 404 choć. Możesz spróbować zmienić flagę na [L,R=404], ale wątpię, że to zadziała (to powinno być tylko dla przekierowań).

Twój pomysł na to w PHP będzie działał. Jeśli wszystkie „strony błędów” Strony są po stronie serwera (tj PHP) to można po prostu użyć tego kodu:

<?php 
header('HTTP/1.0 404 Not Found'); 
include 'error404.html'; 
+0

Yup, to jest prawdopodobnie to, co mam zamiar skończyć. Ciekawi mnie jednak, czy istnieje sposób na wyzwolenie wbudowanej strony błędu Apache (bez konieczności samodzielnego jej tworzenia). Coś jak reguła przepisywania "uruchamiać wewnętrzną obsługę 404, jeśli pasuje ten URL". –

10

Najlepszym sposobem na to jest ustawienie R flagę z kodem stanu 404:

RewriteCond %{REQUEST_URI} ^/dirname/pagename 
RewriteRule^- [L,R=404] 

Ale ta jest dostępna tylko od Apache 2.

+2

lub dla jasności, przeliteruj jako [przekierowanie = 404]. –

+1

często NC jest kolejnym dobrym składnikiem. Pamiętaj, że normales filesmatch-Forbid from All może być bezpieczniejszy, jeśli RewriteEngine może być wyłączony. –

4

Potwierdzam, że

RewriteRule^- [L,R=404] 

lub

RewriteRule^- [L,redirect=404] 

nie będzie działać.Oto wyjaśnienie z oficjalnej strony internetowej Apache:

Jednakże, jeśli kod stanu jest poza zakresem przekierowania (300-399), a następnie ciąg podstawienie spadła całkowicie, a przepisywanie jest zatrzymany jakby L były użyte.

Najlepszym rozwiązaniem jest przekierowanie do pliku 404.php z nagłówkiem 404, jak wyjaśniono później.

+0

Dziękuję. Zastanawiałeś się, dlaczego nigdy nie przekieruje;) –

Powiązane problemy