Правильное переключение между HTTP и HTTPS с использованием .htaccess - PullRequest
19 голосов
/ 10 июля 2009

У нас есть торговый сайт, который мы размещаем на общем хосте (Mediatemple Gridserver). Некоторые части сайта должны использовать HTTPS (оформление заказа и т. Д.), А остальные должны использовать HTTP.

Кто-нибудь знает, как мы всегда можем принудительно использовать HTTP / HTTPS для определенных URL-адресов? У нас он работал в разных состояниях, но мы не можем получить запрос на страницу, которая должна быть по HTTP, но запрашивается с HTTPS для правильного переключения обратно.

Я осмотрелась ТАК, но не смог найти подходящий ответ на этот вопрос.

Ответы [ 6 ]

35 голосов
/ 15 июля 2009

Я использую что-то подобное для моей папки администратора в WordPress:

#redirect all https traffic to http, unless it is pointed at /checkout
RewriteCond %{HTTPS} on
RewriteCond %{REQUEST_URI} !^/checkout/?.*$
RewriteRule ^(.*)$ http://mydomain.com/$1 [R=301,L]

Часть RewriteCond %{HTTPS} on может работать не для всех веб-серверов. Мой веб-хост требует, например, RewriteCond %{HTTP:X-Forwarded-SSL} on.

Если вы хотите применить обратное, попробуйте:

#redirect all http traffic to https, if it is pointed at /checkout
RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} ^/checkout/?.*$
RewriteRule ^(.*)$ https://mydomain.com/$1 [R=301,L]

Если вам нужны альтернативные способы сделать это, посмотрите askapache .

15 голосов
/ 29 марта 2012

Это должно работать практически во всех сценариях и должно работать в вашем реальном vhost или .htaccess:

RewriteEngine on
RewriteCond %{SERVER_PORT} ^80$
RewriteRule ^(.*)$ https://%{SERVER_NAME}/%{REQUEST_URI} [R=301,L]

(не забывайте косую черту перед% {REQUEST_URI}, так как это может позволить передать номер порта, что опасно)

6 голосов
/ 20 апреля 2016
RewriteEngine on
RewriteCond %{HTTPS} off [OR] 
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://%{SERVER_NAME}/%{REQUEST_URI} [R=301,L]

У меня были некоторые проблемы, связанные с нагрузкой. Вот как я это исправил.

1 голос
/ 09 мая 2016

Для меня это сработало (я использовал его для сайта WordPress и перенаправления на HTTPS). Вы должны добавить строки условий и правил сразу за строками RewriteEngine и RewriteBase:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

# I added these two lines for redirect to HTTPS
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://www.yoursite.com/$1 [R=301,L]
# (end of custom modifications)

RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress`

Посмотрите на условие RewriteCond %{HTTP:X-Forwarded-Proto} !https - только это сработало для моего хостинга. (Я тоже пробовал RewriteCond %{SERVER_PORT} !^443$ или RewriteCond %{HTTPS} off, но безуспешно.

1 голос
/ 29 марта 2012

Как указано в этом ответе , исправьте ваше приложение, чтобы при необходимости использовать ссылки https://. Не полагайтесь на автоматическое перенаправление, это может привести к ложному ощущению безопасности, если вы не предоставили своим ссылкам / формам более https:// перейти на https:// URL-адреса. Использование mod_rewrite автоматически затрудняет обнаружение таких ошибок (которые также могут быть уязвимостями).

0 голосов
/ 10 июля 2009

Я думаю, что это должно быть:

RewriteCond %{HTTPS}  =on
^/checkout(.*) http://shoppingsite.com/checkout$1 [R]

См. Документацию mod_rewrite .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...