В Apache 2 vhost у меня есть следующая конфигурация (в моем случае, в .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
На самом деле, что происходит, то, что клиент получает a 302 Found
ответ с перенаправлением к https://example.com/error.php
С другой стороны,
https://example.com/protectedfolder
приводит к пользовательскому (т.е. произведенный error.php) 401
как ожидалось.http://example.com/publicfolder
приводит к 302
перенаправление к https://example.com/publicfolder
, затем a 301
постоянное перенаправление к https://example.com/publicfolder/
, и наконец (поскольку DirectoryIndex отключен), специализированное 403
ошибка. Как ожидалось.http://example.com/nonexistent
причины a 302
кому: https://example.com/nonexistent
и затем специализированное 404
, также как ожидалось.ErrorDocument 401
конфигурация, запрос для http://example.com/protectedfolder
причины 401
сразу, т.е. без перенаправления к https.Нет никакой определенной записи в Apache error.log, но кажется, что проблема происходит, потому что Подлинное требование оценено перед Переписыванием, таким образом вызывает ErrorDocument, и это неправильно все еще http??
Что я должен изменить, чтобы иметь желаемый эффект, т.е. это
http://example.com/protectedfolder
вызывает перенаправление кhttps://example.com/protectedfolder
и только который перенаправленный URL вызывает (специализированный)401
?
Поскольку вы выполняете безусловное перенаправление с http
на https
( плохая идея, если вы хотите, чтобы каждый мог получить доступ общедоступная информация на вашем веб-сайте , BTW), тогда вам нужно просто сделать отдельные записи хоста для : 80
и : 443
, и указать : 80
запись к чему-то вроде пустой папки - тогда у вас не будет mod_auth, конкурирующего с mod_rewrite.