htaccess: заставить http на всех страницах и https на выбранных каталогах - PullRequest
4 голосов
/ 15 августа 2011

У меня есть следующее:

RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} protected [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [L,R=301]

RewriteCond %{HTTPS} on
RewriteCond %{REQUEST_URI} !protected [NC]
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [L,R=301]

Если каталог называется «защищенным», убедитесь, что пользователь использует https. Если в каталоге есть что-то, кроме «защищенного», убедитесь, что пользователь использует http.

Это прекрасно работает, но как мне указать дополнительные каталоги?

Кроме того, есть ли способ, которым это может быть достигнуто без необходимости указывать каталоги дважды? Один раз для включения и один раз для исключения?

Спасибо!

UPDATE

Хотя моя «защищенная» папка была вынуждена использовать https из-за моих правил, все ссылки на изображения, таблицы стилей и javascripts, которых не было в «защищенной» папке, все еще перенаправлялись на http. Это приводит к тому, что «защищенная» страница защищена только частично. Добавление следующего до кода перенаправления решает это:

RewriteRule \.(css|gif|jpe?g|js|png|swf)$ - [L]

Ответы [ 2 ]

7 голосов
/ 15 августа 2011
RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} protected [NC,OR]
RewriteCond %{REQUEST_URI} protected2 [NC,OR]
RewriteCond %{REQUEST_URI} protected3 [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [L,R=301]

RewriteCond %{HTTPS} on
RewriteCond %{REQUEST_URI} !protected [NC]
RewriteCond %{REQUEST_URI} !protected2 [NC]
RewriteCond %{REQUEST_URI} !protected3 [NC]
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [L,R=301]

Вы можете использовать OR, чтобы добавить больше опций!


Подробнее об условиях mod_rewrite: http://httpd.apache.org/docs/current/mod/mod_rewrite.html#RewriteCond

0 голосов
/ 15 августа 2011

Я делаю это в конфигурации vhost (LocationMatch недоступен в htaccess, но таким образом вы можете быть уверены, что никогда не удалите его случайно):
(Примечание: замените __SERVER__ на свой сервер, этоне является автоматическим.)

<VirtualHost *:80>
    ...
    <LocationMatch "(.*(p|P)hpMyAdmin.*)">
        RedirectPermanent / https://__SERVER__/
    </LocationMatch>
</VirtualHost>
<VirtualHost *:443>
    ...
    <LocationMatch "!(.*(p|P)hpMyAdmin.*)">
        RedirectPermanent / http://__SERVER__/
    </LocationMatch>
</VirtualHost>

Я никогда не проверял второй сценарий (перенаправление на небезопасный), но он должен работать (не уверен насчет размещения !).
У меня пока нетнашел хороший способ не указывать их дважды, но достаточно просто скопировать регулярное выражение в одну строку для LocationMatch

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