Перенаправить HTTP на HTTPS для одной страницы - PullRequest
11 голосов
/ 20 августа 2011

Я знаю, что этот вопрос был задан до смерти, но по какой-то причине из 20 прочитанных мной постов у меня ничего не работает должным образом, и, надеюсь, кто-то сможет пролить немного понимания.

По сути, у меня есть простая корзина для покупок, куда я хочу перенаправить 2 URI на HTTPS, на страницу оформления заказа и в папку администратора:

/checkout
/admin

Я могу успешно перенаправить на HTTPS-версию для проверки со следующим кодом:

RewriteEngine On
#https
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^checkout https://palatinehillsestatewinery.com/checkout [R=301,L]

# remove index.php, this is just included to show everything in my .htaccess
RewriteCond $1 !\.(gif|jpe?g|png)$ [NC]
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ /index.php/$1 [L]

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

Я возился с петлями и т. Д.

Если бы кто-нибудь мог помочь с перенаправлением на HTTPS только на этих 2 страницах, а затем на http на всех других страницах, это было бы очень полезно и высоко ценится.

1 Ответ

22 голосов
/ 20 августа 2011

Это не ответ на ваш вопрос напрямую, но я чувствую, что ставлю его как ответ (плюс он слишком велик, чтобы оставлять его в качестве комментария).

Мой совет: пожалуйста, прекратите играть с htaccess для такого рода задач ( принудительное использование нескольких URL-адресов для использования HTTPS и принудительное остальных для использования HTTP).

Лучший способ - создать полные URL для всех ссылок (страниц, а не ресурсов), , где URL включает имя домена и протокол . В этом случае все URL будут иметь правильный протокол (HTTP / HTTPS) сразу. Конечно, вы все еще можете исправить (301 или 302 перенаправление) запросы к предполагаемому быть https, если они (по какой-то странной причине) запрашиваются через HTTP. Вот где .htaccess можно безопасно и легко использовать.

Если пользователь будет запрашивать обычную страницу (должна обслуживаться по HTTP) через HTTPS - тогда позвольте ему сделать это - в этом нет ничего плохого. Да - HTTPS требует немного больше ресурсов на стороне сервера, но если вы сгенерируете все ссылки таким образом, таких ситуаций практически не будет, если только пользователь специально не изменит протокол. Даже если такая одна страница будет обслуживаться по HTTPS, следующая «обычная» ссылка, по которой он щелкнет, будет HTTP - 1 дополнительный просмотр страницы на основе HTTPS не убьет ваш сервер.

Я использую этот подход все время, когда сайт имеет безопасную область ... и на основании журналов у нас менее 0,01% ВСЕХ просмотров страниц, которые были просмотрены / попытались просмотреть по «неправильному» протоколу - - Подавляющее большинство из них были боты или попытки взлома / поиска уязвимостей.

Основываясь на такой статистике, я бы сказал - она ​​отлично работает. да - вам нужно немного изменить свой код / ​​шаблоны, чтобы реализовать это ... но это намного лучше, чем возиться с этим. htaccess и mod_rewrite.


В любом случае, вот правила, которые сделают эту работу за вас:

# force https for all URLs in /checkout
RewriteCond %{HTTPS} =off
RewriteRule ^checkout https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# don't do anything for images/css/js
RewriteRule \.(gif|jpe?g|png|css|js)$ - [NC,L]

# force http for all other URLs that are not in /checkout
RewriteCond %{HTTPS} =on
RewriteCond %{REQUEST_URI} !^/(checkout|index.php/checkout)
RewriteRule .* http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# your other rules here, e.g.:
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ /index.php/$1 [L]

OR

# force https for all URLs in /checkout
RewriteCond %{HTTPS} =off
RewriteRule ^checkout https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# do not do anything for already existing files
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule .+ - [L]

# force http for all other URLs that are not in /checkout
RewriteCond %{HTTPS} =on
RewriteCond %{REQUEST_URI} !^/checkout
RewriteRule .* http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# your other rules here, e.g.:
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ /index.php/$1 [L]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...