Перенаправить HTTP на HTTPS на одну страницу

Я знаю, что эта проблема была спрошена до смерти, но по некоторым причинам из 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

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

Мой совет: пожалуйста, прекратите играть с htaccess для этой задачи (force несколько URL-адресов, чтобы использовать HTTPS и force), чтобы использовать 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]

ИЛИ

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