Apache2 перенаправляет все страницы, кроме некоторых, обратно на http, используя vhosts - PullRequest
1 голос
/ 02 сентября 2011

Я использую правила перезаписи с Apache 2 для перенаправления определенных типов страниц в HTTPS с использованием vhosts. Это все, что начинается с mydomain.com/users. Другими словами, все страницы, имеющие отношение к пользователям и их информации, должны быть на HTTPS. Я хочу перенаправить все остальные страницы в HTTP.

Что происходит сейчас, так это то, что когда пользователь переходит на страницу /users, он отлично перенаправляется на HTTPS. Но когда он уходит из области /users, я не могу перенаправить обратно на HTTP.

Мне нужны правила и условия, чтобы переписать все, что НЕ /users/*, в HTTP. Другими словами, пожалуйста, помогите мне заполнить пробелы:

RewriteCond %{SERVER_PORT} ^443$
RewriteCond %{REQUEST_URI} __blank__
RewriteRule __blank__ http://mydomain.com%{REQUEST_URI} [R=301,L]

Исследуя это, я стараюсь избегать нескольких вещей. Мне нужен шаблон под /users, потому что я разрабатываю приложение и часто добавляю страницы под пользователями (это приложение Rails).

Я понимаю, что нелегко сделать НЕ совпадение с регулярными выражениями. Все, что я пытаюсь сделать, это сделать так, чтобы основная часть сайта работала по HTTP, за исключением страниц /users/* по HTTPS.

Кроме того, да, у меня есть действующий сертификат, и да, я проверил, работает ли мод переписывания Apache2. Я могу получить все URL переписаны на HTTP без проблем. Как мне НЕ переписать те, которые начинаются с /users в REQUEST_URI? Я думаю, что до сих пор пробовал каждый ответ на этом сайте ...

1 Ответ

3 голосов
/ 04 сентября 2011

Существует довольно много ответов на такие вопросы, - вам просто нужно немного поискать на этом сайте. Да, они не отвечают на ваш вопрос сразу на 100% (поскольку у всех немного разные требования - например, разные названия страниц и т. Д.), Но весь подход один и тот же.

В любом случае - вот как это можно сделать:

Options +FollowSymLinks -MultiViews
RewriteEngine On
RewriteBase /

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

# force https for /users/*
RewriteCond %{HTTPS} =off
RewriteRule ^/users/ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

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

# your other rewrite rules below
  1. Эти правила должны быть помещены в директиву VirtualHost ДО любых других правил перезаписи (если таковые имеются). Если размещено в другом месте может потребоваться небольшая настройка.

  2. Они будут

    • принудительное использование HTTPS для всех ресурсов в /users/,
    • ничего не делать для изображений, стилей CSS и файлов JavaScript (точнее, для файлов с этими расширениями)
    • и заставит HTTP для всех других URL

ВАЖНОЕ ПРИМЕЧАНИЕ: Весьма вероятно, что это правило не сработает для вас сразу. Это потому, что современный браузер CACHE 301 перенаправляет с ваших предыдущих попыток. Поэтому я рекомендую протестировать его в другом браузере и изменить 301 на 302 во время тестирования (302 не кэшируется) .. или очистить все кэши браузера (возможно, даже историю) и перезапустить браузер.

...