2013-10-15 17 views
27

Muszę przekierować port 80 do 2368 w htaccess, ale chciałbym zachować nienaruszony żądany protokół, aby SSL się nie zepsuł.Zachowaj protokół HTTP/HTTPS w przekierowaniach .htaccess

Obecnie mam to:

RewriteCond %{HTTP_HOST} ^sub.domain.com$ [NC] 
RewriteRule^http://sub.domain.com:2368%{REQUEST_URI} [P,QSA,L] 

który działa poprawnie, ale chciałbym protokół należy podjąć z% {} HTTP_HOST stanie, jeśli to możliwe.

Czy istnieje sposób na zwiększenie dynamiki bez twardych domen i protokołów kodowania?

Wydaje się bardzo powolny, jak jest.

Odpowiedz

20

Spróbuj dodać STAN:

RewriteCond %{HTTPS} off [OR] 
RewriteCond %{HTTPS}:s on:(s) 

który sprawdza, że ​​albo HTTPS jest wyłączony lub jest na i można użyć wstecznych sprowadzić „S” znak:

RewriteCond %{HTTP_HOST} ^sub.domain.com$ [NC] 
RewriteCond %{HTTPS} off [OR] 
RewriteCond %{HTTPS}:s on:(s) 
RewriteRule^http%1://sub.domain.com:2368%{REQUEST_URI} [P,QSA,L] 

Więc jeśli HTTPS jest wyłączony, %1 jest puste, a protokół to http://. Jeśli HTTPS jest włączony, to "s" jest zgrupowane, a referencyjna odpowiedź jest "s", więc protokół to https://.

Jednak to wszystko przy założeniu, że port 2368 może obsłużyć zarówno niezaszyfrowany i SSL/TLS.

+0

Tylko mały komentarz. To nie jest przekierowanie, rozwiązuje to serwer działający jako proxy (flaga P). Aby wykonać rzeczywiste przekierowanie i poprosić klienta o przejście do innego adresu URL, należy użyć flagi R zamiast P. – Ludecan

53

Sztuką dostarczone przez Jona jest ładny hack, ale obawiam się, to może pęknąć, jeśli chcesz używać więcej [OR] warunki, a jeśli używasz więcej odwołania wstecznego trzeba być ostrożnym, który numer użyć (%1 lub %2 lub ..).

Myślę, że najbardziej eleganckie, wytrzymałe i czyste rozwiązanie dla smart HTTP/HTTPS handling jest ustawienie zmiennej:

# initialization code - put only once at the beginning of .htaccess 
RewriteCond %{HTTPS} =on 
RewriteRule ^(.*)$ - [env=proto:https] 
RewriteCond %{HTTPS} !=on 
RewriteRule ^(.*)$ - [env=proto:http] 

# simply use %{ENV:proto} in your rules: 
RewriteCond %{HTTP_HOST} ^sub.domain.com$ [NC] 
RewriteRule^   %{ENV:proto}://sub.domain.com:2368%{REQUEST_URI} [P,QSA,L] 

Zaletą jest również, że kod inicjujący musi być uruchomiony tylko raz, więc jeśli masz więcej przepisać zasady, a wynikowy kod jest znacznie krótszy i bardziej elegancki.

Uwaga: często stosowana konfiguracja to https z chmurą chmurową, w którym to przypadku protokół HTTPS nie jest włączony na samym serwerze. W tym przypadku potrzebne są dodatkowe zasady jak (kolejność uwaga):

RewriteCond %{HTTP:CF-Visitor} '"scheme":"http"' [OR] 
RewriteCond %{HTTPS} !=on 
RewriteRule ^(.*)$ - [env=proto:http] 
RewriteCond %{HTTP:CF-Visitor} '"scheme":"https"' [OR] 
RewriteCond %{HTTPS} =on 
RewriteRule ^(.*)$ - [env=proto:https] 
+1

W moim przypadku było to '% {ENV: HTTPS}' ale poza tym, świetnie! Do debugowania wystarczy dodać '#% {HTTPS} -% {ENV: HTTPS} -% {ENV: proto}' do celu przekierowania i sprawdzić, gdzie się on znajduje. – frostschutz

+0

Zmienna i grupa zmiennych regex w przepisach RewriteRules, które ustawiają zmienną środowiskową ('^ (. *) $') Jest nadmierna i powinna zostać usunięta, ponieważ nie jest używana później, zamiast tego myślnik (-) jest używany po prostu Przejść przez. Na przykład wszystko, czego potrzebujesz, to 'RewriteRule. - [env = ...] 'lub podobne. –

+0

Bardzo dobry pomysł, aby zachować proto w env. Działa to dobrze, gdy potrzebujesz wielu odwołań wstecznego RewriteCond, ale oczywiście to nie działa. – Adambean

7

Lub można użyć the solution posted as an answer by Jon Lin i przepisać go do korzystania z jednego RewriteCond a następnie ustawić zmienną as suggested in the answer by TMS.

To będzie wyglądać następująco:

RewriteCond %{HTTPS}s ^(on(s)|offs)$ 
RewriteRule^- [env=s:%2] 

RewriteCond %{HTTP_HOST} ^sub.domain.com$ [NC] 
RewriteRule^http%{ENV:s}://sub.domain.com:2368%{REQUEST_URI} [P,QSA,L] 

Lub, jeśli wolisz:

RewriteCond %{HTTPS}s ^(on(s)|offs)$ 
RewriteRule^- [env=proto:http%2] 

RewriteCond %{HTTP_HOST} ^sub.domain.com$ [NC] 
RewriteRule^%{ENV:proto}://sub.domain.com:2368%{REQUEST_URI} [P,QSA,L] 
27

Zaczynając od Apache 2.4 można również użyć zmiennej %{REQUEST_SCHEME} zachować schematu:

RewriteRule "^" "%{REQUEST_SCHEME}://sub.domain.com:2368%{REQUEST_URI}" [P,QSA,L] 

Nie trzeba wtrącać się w żadne warunki w ten sposób.