.htaccess требует SSL для определенного URL - PullRequest
1 голос
/ 03 ноября 2008

Я хочу заставить Apache использовать HTTPS для определенного URL в следующей форме:

https://www.example.com/signup/*

так

если кто-то напрямую перейдет по любому из следующих примеров URL-адресов, Apache перенаправит URL-адрес на эквивалентный HTTPS-сайт.

, например

http://www.example.com/signup  -->  https://www.example.com/signup
http://www.example.com/signup/basic+plan  -->  https://www.example.com/signup/basic+plan
http://www.example.com/signup/premium  -->  https://www.example.com/signup/premium 

Кто-нибудь знает как?

Заранее спасибо

Ответы [ 7 ]

5 голосов
/ 03 ноября 2008

Спасибо Мурат,

Ваш почти сработал, но понял, как заставить его работать точно.

Вот что работает:

RewriteCond %{SERVER_PORT} 80 
RewriteCond %{REQUEST_URI} ^/somefolder/?
RewriteRule ^(.*)$ https://www.domain.com/$1 [R,L]

Обратите внимание, что я не включил папку в переписывающую страницу www.domain.com

4 голосов
/ 03 ноября 2008

Я думаю, это было то, что я использовал:

RewriteEngine On 
RewriteCond %{SERVER_PORT} 80 
RewriteCond %{REQUEST_URI} ^/somefolder/?
RewriteRule ^(.*)$ https://www.domain.com/somefolder/$1 [R,L]

(из здесь )

3 голосов
/ 03 ноября 2008

Вы можете использовать директиву Redirect :

Redirect 301 /signup https://www.example.com/signup

Это автоматически сохранит все, что следует после / регистрации в URL. Обязательно настройте эту директиву только на своем сайте без SSL, иначе он может попасть в рекурсивный цикл!

1 голос
/ 28 марта 2009

Я использовал следующее, чтобы запросить SSL в разделе оформления заказа на сайте:

<Directory "/var/www/html">
        RewriteEngine on
        Options +FollowSymLinks
        Order allow,deny
        Allow from all
        RewriteCond %{SERVER_PORT} !^443$
        RewriteRule \.(gif|jpg|jpeg|jpe|png|css|js)$ - [S=1]
        RewriteRule ^checkout(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R]
</Directory>

Так, например, нажатие http://www.example.com/checkout перенаправляет на https://www.example.com/checkout

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

Если вы хотите, чтобы несколько страниц изменили RewriteRule на что-то вроде:

RewriteRule ^(checkout|login)(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R]

Конечно, каталог должен соответствовать фактическому пути на вашем сервере. Эта страница также может помочь с дополнительной информацией для ваших конкретных потребностей: http://www.whoopis.com/howtos/apache-rewrite.html

Я использую это на веб-сайте, на котором работает Plesk 8.6, но это не должно иметь значения. Это в моем файле vhost.conf, это все равно что поместить его в ваш файл httpd.conf. Я не уверен, нужно ли вам что-то настраивать, чтобы использовать его в файле .htaccess, но я сомневаюсь в этом. При добавлении в файл conf не забудьте перезапустить apache для перезагрузки конфигурации.

Если вы похожи на меня и хотите использовать SSL только на определенных страницах, то вам также нужно правило перезаписи, которое отправляет вас обратно в обычный http для остальных. Для обратного эффекта вы можете использовать следующее:

RewriteCond %{SERVER_PORT} ^443$
RewriteRule \.(gif|jpg|jpeg|jpe|png|css|js)$ - [S=1]
RewriteRule !^(checkout|login)(.*)$ http://%{SERVER_NAME}%{REQUEST_URI} [L,R]

Если вы используете Plesk, как я, имейте в виду, что весь не-SSL трафик использует файл vhost.conf, но весь SSL-трафик использует файл vhost_ssl.conf. Это означает, что ваше первое правило перезаписи, требующее SSL, будет помещено в файл vhost.conf, но второе правило для принудительного возврата к не-SSL должно быть помещено в файл vhost_ssl. Если вы используете httpd.conf или .htaccess, я думаю, вы можете поместить их обоих в одно и то же место.

Я также разместил это руководство в своем блоге: Правила переписывания Apache для принудительного использования защищенных / незащищенных страниц .

1 голос
/ 03 ноября 2008

Вы должны взглянуть на mod_rewrite документацию

0 голосов
/ 23 июля 2018

.htaccess файлы обычно помещаются в область видимости с помощью Options -FollowSymLinks, которая блокирует правила перезаписи. Часто это правило безопасности.

Так что часто требуется более тривиальная вещь, как эта:

<If "%{HTTPS} != 'on'">
  Redirect 301 /your/path https://www.example.com/your/path
</If>

Это небольшое улучшение к ответу Грега Хьюгилла.

0 голосов
/ 03 ноября 2008

Вы можете сделать это с помощью mod_rewrite -

RewriteCond% {SERVER_PORT}! ^ 443 $

RewriteRule ^ / signup https://example.com/signup

RewriteRule ^ / signup /(.*)$ https://example.com/signup/$1

Должно работать, хотя я его не проверял.

- редактировать -

Исправление, я только что попробовал это на одном из моих серверов, и он прекрасно работает для меня. Вы можете перепроверить вашу конфигурацию mod_rewrite. Кроме того, если вы используете .htaccess, вам нужно убедиться, что для этого каталога разрешены переопределения.

В качестве примечания следует, что ваш SSL-трафик идет через порт 443. Если это не так, вам нужно соответствующим образом изменить условие перезаписи.

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