В хосте 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 оценивается перед перезаписью, поэтому вызывает ErrorDocument, и это ошибочно по-прежнему http ??
Что мне нужно изменить, чтобы получить желаемый эффект, т.е.
http://example.com/protectedfolder
вызывает перенаправление наhttps://example.com/protectedfolder
и только этот перенаправленный URL вызывает (настраиваемый)401
?
Поскольку вы делаете безусловное перенаправление с http
к https
(плохая идея, если вы хотите, чтобы каждый имел доступ к публичной информации на вашем сайте., BTW), тогда вы должны просто сделать отдельные записи хоста для :80
и :443
, и укажите :80
запись к чему-то вроде пустой папки - тогда у вас не будет конкуренции mod_auth с mod_rewrite.