Как принудительно установить HTTPS в каталоге и принудительно установить HTTPS-аутентификацию - PullRequest
5 голосов
/ 23 декабря 2010

Мне интересно, каков наилучший способ принудительной аутентификации HTTPS.

Когда у меня есть это в моем файле .htaccess:

AuthType Basic
AuthName "Developer"
AuthUserFile /usr/local/etc/apache22/passwords/passwords
Require user david

Аутентификация работает, но она аутентифицируется через порт 80, отправив пароль в открытом виде.

Поэтому я решил добавить правило перенаправления для перенаправления всех не-HTTPS-запросов на эквивалентные HTTPS-запросы:

RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteBase /~david/
RewriteRule ^(.*)$ https://myserver.tld/~david/$1 [R,L]

Это также работает, но этосначала аутентифицируется на порту 80, затем перенаправляет, затем снова аутентифицируется на порту 443. Я НЕ хочу аутентифицироваться на порте 80, потому что пароль будет отправлен в виде открытого текста.Я не смог найти хороший способ, чтобы сразу перенаправить на HTTPS, а затем аутентифицировать.

Единственный способ понять, как это сделать, это сделать:

AuthType Basic
AuthName "Developer"
AuthUserFile /usr/local/etc/apache22/passwords/passwords
Require user david
ErrorDocument 403 /403.php
SSLRequireSSL

И, имея PHP-скрипт 403.php на / моего сервера:

<?php

header('Location: https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);

?>

Это желаемое поведение.Для этого требуется SSL, поэтому при попытке доступа к каталогу через порт 80 он выдает специальный документ об ошибке, и этот документ перенаправляет страницу на HTTPS.

Это похоже на kludge.Есть ли лучший способ сделать это?

1 Ответ

13 голосов
/ 23 декабря 2010

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

Простой подход к отладке / пониманию - перейти к такой структуре:

<VirtualHost *:80>
   ...
   RewriteRule ^/foo/bar/?(.*)$ https://myserver.tld/foo/bar/$1 [R,L]
   # and to guard against typo's...
   <Directory /foo/bar/>
       deny from all
   </Directory>
</VirtualHost>


<VirtualHost *:443>
   ...
   <Directory /foo/bar/>
       BasicAuth .. etc.
       allow from all
   </Directory>
</VirtualHost>

и возьмите вещи оттуда.

Dw.

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