2015-06-02 23 views
10

Używam nasłuchu HAProxy na 80, aby wysłać żądania do serwera węzła (port: 3000) lub serwera php (4000); Mam również zainstalowany CSF, który ma porty 3000 i 80 dostępne.Jak przekierować do 404, gdy adres URL wskazuje na istniejący folder (bez ukośnego ukośnika). HAproxy lub mod-przepisują powiązane

To działa dobrze, kiedy mogę przeglądać strony w http://example.com/forum/1/page.php, ale czasami, kiedy przypadkowo wejść example.com/forum/1 (bez końcowy ukośnik), utrzymuje załadunek i ostatecznie prowadzi do strony błędu ERR_CONNECTION_TIMED_OUT. Pasek adresu pokazuje, że został przekierowany do http://example.com:4000/forum/1/.

Ponieważ nie mam otwartego portu 4000, gdy wielokrotnie przechodzę do example.com/forum/1, wywołałoby to blok przez CSF. Moje pytanie brzmi: czy mogę przekierować wszystkie żądania wskazujące na rzeczywisty folder example.com/forum/1 (bez końcowego ukośnika) na stronę 404? Próbowałem dodać regułę przepisywania, aby dołączyć końcowe ukośniki do każdego żądania, ale to by złamało wszystkie moje względne ścieżki (zobacz mój problem na tym post).

To, co chcę wiedzieć, dlaczego został przekierowany na http://example.com:4000/forum/1/ z http://example.com/forum/1? Czy było spowodowane przez HAproxy?

Niektóre HAProxy config:

frontend all 0.0.0.0:80 
    timeout client 1h 
    # use apache2 as default webserver for incoming traffic 
    default_backend apache2 

backend apache2 
    balance roundrobin 

    option forwardfor 
    server apache2 myIpAddress:4000 weight 1 maxconn 1024 check 

    # server must be contacted within 5 seconds 
    timeout connect 5s 
    # all headers must arrive within 3 seconds 
    timeout http-request 3s 
    # server must respond within 25 seconds. should equal client timeout 
    timeout server 25s 

Oto moje zasady przepisujące:

RewriteCond %{REQUEST_FILENAME} -d [OR] 
RewriteCond %{REQUEST_FILENAME} -f [OR] 
RewriteCond %{REQUEST_FILENAME} -l 
RewriteRule^- [L] 

RewriteCond %{REQUEST_URI} !^.*\.(jpg|css|js|gif|png)$ [NC] 
RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule !.*\.php$ %{REQUEST_FILENAME}.php [QSA,L] 

RewriteCond %{THE_REQUEST} /index\.php [NC] 
RewriteRule ^([^\.]+)$ $1.php [NC,L] 

Odpowiedz

3

Od /forum/1 jest prawidłowy fizyczny zostaniesz przekierowany do /forum/1/ powodu tego ustawienia:

DirectorySlash On 

, który jest używany przez moduł o nazwie mod_dir, która dodaje ukośny ukośnik po katalogach, jeśli go brakuje.

Można oczywiście włączyć tę flagę wyłączyć za pomocą:

DirectorySlash Off 

ale be aware of security implications.

być bardziej zabezpieczyć trzeba także:

Options -Indexes 

wyłączyć listę katalogów.

Bezpieczeństwo Ostrzeżenie (skopiowane z połączonego instrukcji)

Wyłączanie końcowy ukośnik przekierowanie może doprowadzić do ujawnienia informacji. Rozważmy sytuację, w której aktywny jest mod_autoindex() i DirectoryIndex dla prawidłowego zasobu (powiedzmy, index.html) i nie istnieje żaden inny specjalny program obsługi dla tego adresu URL. W takim przypadku żądanie z końcowym ukośnikiem pokazuje plik index.html. Ale żądanie bez ukośnego ukośnika wyświetli zawartość katalogu.


Aktualizacja: Aby odpowiedzieć na tę część pytania:

Moje pytanie brzmi, czy mogę przekierować wszystkie żądania, które są skierowane do rzeczywistego folderu example.com/forum/1 (bez spływu ukośnik) do strona 404?

Można użyć tego kodu w /forum/1/.htaccess:

DirectorySlash On 
RewriteEngine On 

RewriteRule ^$ - [L,R=404] 

To wymusi ukośnik tak, że reguła przepisywania można używać do wysyłania błąd 404.

+0

Czy znalazłeś coś złego w tej odpowiedzi? – anubhava

2

W pliku .htaccess dodaj następujący kod. Zastąp /404.php dowolnym plikiem, który chcesz.

ErrorDocument 404 /404.php 
1

umieścić to na górze .htaccess

DirectorySlash Off 
RewriteOptions AllowNoSlash 
RewriteEngine On 
RewriteCond ${REQUEST_FILENAME} -d 
RewriteRule ^(.*[^/])$ - [L,R=404] 

DirectorySlash Off uczyni katalogi dostępne bez-slash bez przekierowania.

Ale problem polega na tym, że wersja nie-slash po prostu wyświetla zawartość katalogu. Zamawiam, aby tego uniknąć, dodano RewriteOptions AllownoSlash.

Teraz, gdy żądany jest folder bez ukośnika, powstaje błąd 404.