
В виртуальном хосте Apache 2 у меня есть следующая конфигурация (в моем случае, в .htaccess
корне документа (который для простоты одинаков для http:80 и https:443)
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
для того, чтобы перенаправить любые http-соединения на https Более того,
ErrorDocument 500 /error.php
ErrorDocument 404 /error.php
ErrorDocument 403 /error.php
ErrorDocument 402 /error.php
ErrorDocument 401 /error.php
для создания пользовательских сообщений об ошибках. Третий ингредиент — защищенная подпапка с требуемой аутентификацией ( .htaccess
в этой папке):
AuthType Basic
AuthName "Test"
AuthUserFile /some/path/to/passwords
Require user joe
Все работает отлично, за исключением случаев, когда кто-то пытается получить ответ. http://example.com/protectedfolder
Фактически, происходит следующее: клиент получает 302 Found
ответ с перенаправлением наhttps://example.com/error.php
С другой стороны,
https://example.com/protectedfolder
приводит к пользовательскому (т.е. созданному error.php),401
как и ожидалось.http://example.com/publicfolder
приводит к302
перенаправлению наhttps://example.com/publicfolder
, затем к301
постоянному перенаправлению наhttps://example.com/publicfolder/
, и наконец (поскольку DirectoryIndex отключен) к настраиваемой403
ошибке. Как и ожидалось.- Кроме того,
http://example.com/nonexistent
вызывается ,302
аhttps://example.com/nonexistent
затем настроенный404
, также как и ожидалось. - Если я отключу
ErrorDocument 401
конфигурацию, то запрос будетhttp://example.com/protectedfolder
выполнен401
сразу, т.е. без перенаправления на https.
В Apache error.log нет конкретной записи, но, похоже, проблема возникает из-за того, что требование Auth оценивается до Rewrite, таким образом, вызывается ErrorDocument, а это по-прежнему ошибочно http??
Что мне нужно изменить, чтобы получить желаемый эффект, т. е. чтобы
http://example.com/protectedfolder
вызывалось перенаправлениеhttps://example.com/protectedfolder
и только этот перенаправленный URL вызывал (настраиваемый)401
?
решение1
Так как вы делаете безусловное перенаправление с http
на https
(плохая идея, если вы хотите, чтобы каждый мог получить доступ к публичной информации на вашем веб-сайте, кстати), то вам просто следует создать отдельные записи хоста для :80
и :443
и указать в :80
записи что-то вроде пустой папки — тогда у вас не будет mod_auth, конкурирующего с mod_rewrite.