Korzystam z następującego kodu, aby kierować wszystkie żądania www na adresy URL inne niż www:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.example\.org$ [NC]
RewriteRule ^(.*)$ http://example.com/$1 [R=301,L]
Działa to świetnie w pliku .htaccess w katalogu głównym mojej witryny.
Na przykład
www.example.com -> example.com/
www.example.com/ -> example.com/
www.example.com/other_page -> example.com/other_page
Jeśli jednak przeniosę ten sam kod do mojej konfiguracji VirtualHost, przepisane adresy URL zawierają podwójny ukośnik.
www.example.com -> example.com//
www.example.com/ -> example.com//
www.example.com/other_page -> example.com//other_page
Naprawiłem to, usuwając ukośnik z reguły przepisywania:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.example\.org$ [NC]
RewriteRule ^(.*)$ http://example.com$1 [R=301,L]
Ale nie mogę zrozumieć przyczyny tego. Czy ktoś wie dlaczego?
źródło
RewriteRule ^/?(.*)$ http://example.com/$1 [R=301,L]
wykonał lewę.Dzieje się tak, ponieważ przechwytujesz początkowy ukośnik,
(.*)
a następnie nakładasz inny ukośnik przed nim w nowej lokalizacji/$1
. Nie zdarzyło się to wcześniej, ponieważ mod_rewrite zachowuje się nieco inaczej podczas pracy w kontekście dla poszczególnych katalogów, w przeciwieństwie do kontekstu dla jednego serwera.Można tego uniknąć, opcjonalnie uprzedzając slash. Dodatkowo możesz użyć RedirectMatch w pustym VirtualHost ze swoimi nadwyżkowymi domenami, co zapewnia nieco mniej przetwarzania i może wyglądać czystiej.
źródło
Załączam ten post dla kompletności.
Dokumentacja Apache wyjaśnia, dlaczego takie zachowanie występuje bardzo dobrze i jest przyczyną istnienia dyrektywy „RewriteBase”.
Po prostu włączenie dyrektywy „RewriteBase” do pliku .htaccess powinno osiągnąć pożądany rezultat.
Przykład:
Z dokumentacji mod_rewrite Apache 2.2:
Moją ogólną zasadą jest prawie zawsze używanie „RewriteBase” w plikach .htaccess, a nie używanie go w konfiguracji Apache.
źródło
Nie miałem czasu poradzić sobie z tym problemem, więc po prostu przepisz // do / :)
źródło