2013-10-15 6 views
27

Мне нужно перенаправить порт 80 на 2368 в htaccess, но я хотел бы сохранить запрошенный протокол без изменений, чтобы SSL не сломался.Сохранять протокол HTTP/HTTPS в перенаправлении .htaccess

настоящее время у меня это:

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

, который работает правильно, но я хотел бы протокол, чтобы быть взяты из% {} HTTP_HOST условии, если это возможно.

Есть ли способ сделать это более динамичным без жестких доменов и протоколов кодирования?

Кажется очень медленным, как есть.

ответ

20

Попробуйте добавить условие, как:

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

, который проверяет, что либо HTTPS выключен или это, и вы можете использовать обратную ссылку для извлечения «S» характера:

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] 

Так что если HTTPS выключен, %1 пуст и протокол http://. Если HTTPS включен, то «s» сгруппировано, а обратная ссылка %1 является «s», поэтому протокол https://.

Однако все это предполагает, что порт 2368 может обрабатывать как, так и незашифрованный и SSL/TLS.

+0

Просто небольшой комментарий. Это не перенаправление, это разрешается сервером, выступающим в качестве прокси (флаг P). Чтобы сделать реальную переадресацию и попросить клиента перейти на другой URL-адрес, вы должны использовать флаг R вместо P. – Ludecan

53

Трюк предоставленный Джон хороший работник, но я боюсь, что это может сломаться, если вы хотите использовать более [OR] условия, и если вы используете больше обратных ссылок вы должны быть осторожны, в число которых использовать (%1 или %2 или ..).

Я думаю, что самое элегантное, надежное и чистое решение для smart HTTP/HTTPS handling это установить переменный:

# 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] 

Преимущество также в том, что код инициализации должен быть запущен только один раз, так что если у вас есть больше переписывают правил, то полученный код намного короче и элегантнее.

Обратите внимание, что общая настройка - https с облачным флагом, и в этом случае HTTPS не включен на самом сервере. В этом случае требуются дополнительные правила, как (примечание заказа):

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

В моем случае это было '% {ENV: HTTPS}', но кроме этого, отлично! Для отладки вы можете просто добавить '#% {HTTPS} -% {ENV: HTTPS} -% {ENV: proto}' к цели перенаправления и посмотреть, куда она идет. – frostschutz

+0

Соответствие переменных и регулярное выражение в RewriteRules, которые задают переменную среды ('^ (. *) $'), Является чрезмерным и должно быть удалено, поскольку оно фактически не используется впоследствии, вместо этого тире (-) используется просто пройти через. Так, например, все, что вам нужно, это 'RewriteRule. - [env = ...] 'или аналогичный. –

+0

ОЧЕНЬ хорошая идея сохранить прото в env. Это работает хорошо, когда вам нужно несколько обратных ссылок RewriteCond, но, очевидно, это не работает. – Adambean

7

Или, вы можете использовать the solution posted as an answer by Jon Lin и переписать его, чтобы использовать один RewriteCond, а затем установить переменную as suggested in the answer by TMS.

Это будет выглядеть следующим образом:

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] 

Или, если вы предпочитаете:

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

Начиная с Apache 2.4 вы также можете использовать переменную %{REQUEST_SCHEME}, чтобы сохранить схему:

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

Не нужно вмешиваться в любые условия таким образом.

Смежные вопросы