2012-05-04 30 views
9

Tu jest mój plik .htaccess:.htaccess - przerwij przetwarzanie, jeśli przepisanie jest prawdziwe?

Options +FollowSymlinks 
RewriteEngine on 

Rewritecond %{http_host} ^mysite.com [nc] 
Rewriterule ^(.*)$ http://www.mysite.com/$1 [r=301,nc] 

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule . /404.php 

The 1st bloku RewriteCond/RewriteRule jest przekierowanie użytkownika do www gdyby weszli adres bez www.

The 2nd blok RewriteCond/RewriteRule jest przekierowanie użytkownika na stronie, który został utworzony, jeśli wejdą do nieistniejącego adresu.

Każda z tych reguł działa na własną rękę:

Jeśli mój plik .htaccess zawiera tylko pierwszy blok, to z powodzeniem przekierowywane zakaz adresy www pod adresem www.

A jeśli nieistniejący adres jest wpisany, użytkownik zostanie pomyślnie przekierowany do mojego widoku 404.php.

Jednakże, jeśli plik .htaccess zawiera zarówno bloków, a nie adres www zostanie wprowadzony, wówczas zamiast udanej przekierowania na adres www, dodaje się dzieje:

(1) Poniżej wyświetlane na stronie:

przeniesiony na stałe

dokument został przeniesiony tutaj.

Dodatkowo, błąd Błąd 500 Internal Server napotkano podczas próby korzystania z ErrorDocument obsłużyć żądania.

Apache/1.3.41 Server w mysite.com port 80

(2) Poniższy wpis jest generowany w dzienniku błędów:

[Pią 4 maja 2012 01:54:19 [Błąd] ] [klient 109.109.109.109] mod_rewrite: maksymalna liczba wewnętrznych przekierowań osiągnięta. Zakładając błąd konfiguracji. Użyj "RewriteOptions MaxRedirects", aby zwiększyć limit, jeśli jest to konieczne.

Przypuszczam, że to, co się dzieje, że nieskończona pętla jest w jakiś sposób jest generowany.

Zastanawiam się, czy mówienie plik .htaccess, aby zatrzymać przetwarzanie poleceń, jeśli pierwszy warunek został spełniony rozwiązałoby problem. Czy ktoś wie, jak to zrobić?

(uwaga Side. W ogóle uważam, że dokumentację tam na .htaccess być absolutnie przerażające. Zastanawiam się, czy ktoś czuje podobnie.)

Z góry dzięki.

Odpowiedz

10
+1

wziąłem twojej rady, więc jedyną zmianą do mojego pliku jest to, że najpierw przepisać rule ma następującą postać: 'Rewriterule^(. *) $ http://www.mysite.com/$1 [r = 301, nc, L]' I teraz wszystko działa poprawnie. Dziękuję. – oyvey

+0

Nie ma potrzeby ponownej iteracji witryny. A: Apache RewriteRules są domyślnie chciwe. ☞ 'RewriteRule (. *) $ 1 [R = 404, L]' –

3

można próbować ten kod zamiast:

Options +FollowSymLinks -MultiViews 
# Turn mod_rewrite on 
RewriteEngine On 
RewriteBase/

ErrorDocument 404 404.php 

Rewritecond %{HTTP_HOST} ^mysite\.com$ [NC] 
Rewriterule^http://www.mysite.com%{REQUEST_URI} [R=302,NC,L] 

Po zweryfikowaniu, że to działa poprawnie następnie zmienić R=302 do R=301.

+0

Dzięki. Właściwie zajmowałem się przekierowaniami na złe adresy za pośrednictwem ErrorDocument, ale jeśli dobrze pamiętam, nie działało to dla adresów kończących się php, i dlatego przestawiłem się na obecny kod. – oyvey

Powiązane problemy