Правильное переключение между HTTP и HTTPS с использованием .htaccess
У нас есть сайт для покупок, который мы размещаем на общем хосте (Mediatemple Gridserver). Некоторым частям сайта необходимо использовать HTTPS (checkout и т.д.), А остальное - HTTP.
Кто-нибудь знает, как мы всегда можем принудительно использовать HTTP/HTTPS для определенных URL-адресов? Мы работали в разных состояниях, но мы не можем получить запрос на страницу, которая должна быть на HTTP, но запрашивается с HTTPS для правильного возврата.
Я посмотрел вокруг SO, но не смог найти подходящего ответа на этот вопрос.
Ответы
Ответ 1
Я использую что-то похожее на это для папки admin в 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.
Ответ 2
Это должно работать практически во всех сценариях и должно работать в вашем реальном vhost или .htaccess:
RewriteEngine on
RewriteCond %{SERVER_PORT} ^80$
RewriteRule ^(.*)$ https://%{SERVER_NAME}/%{REQUEST_URI} [R=301,L]
(не забывайте косую черту перед% {REQUEST_URI}, так как это может привести к тому, что число портов будет опасным)
Ответ 3
RewriteEngine on
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://%{SERVER_NAME}/%{REQUEST_URI} [R=301,L]
У меня была проблема с загрузкой. Это как я исправил его.
Ответ 4
Как указано в этом ответе, исправьте приложение, чтобы использовать ссылки https://
при необходимости. Не полагайтесь на автоматическое перенаправление, это может привести к ложному пониманию безопасности, если вы не сделали ваши ссылки/формы, обслуживаемые через https://
, перейдите на https://
URL-адреса. Использование mod_rewrite
автоматически затрудняет обнаружение таких ошибок (что также может быть уязвимостью).
Ответ 5
Для меня это работало (я использовал его для сайта 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
, но безуспешно.
Ответ 6
Я думаю, что это должно быть:
RewriteCond %{HTTPS} =on
^/checkout(.*) http://shoppingsite.com/checkout$1 [R]
См. документацию mod_rewrite.