这是针对运行 Apache 2.2 的旧系统,出于各种原因,安全 Web 服务器无法在端口 443 上运行(该端口已被其他程序使用)。因此,它配置为在端口 8443 上运行,我在非 SSL 配置中加入了以下行,它将所有对“管理”页面的请求重定向到安全连接:
RewriteRule ^/admin(.*)$ https://%{SERVER_NAME}:8443/admin [R=302,L]
这很好用-如果您尝试浏览到:
http://server.com/admin
您已正确重定向至:
https://server.com:8443/admin
此时,将出现一个身份验证表单,用于登录,并AuthType
设置为Digest
。这似乎工作正常,但在输入有效的用户名和密码后,浏览器将重定向到:
https://server.com/admin
^^^^^ ^
注意缺少的端口号。现在,如果你首先在浏览器中输入完整正确的地址:
https://server.com:8443/admin
然后出现相同的 apache 身份验证表单,但这次登录后,端口号保留,并显示管理页面。
因此,我的问题是,在不更改端口号的情况下,我能否以保留端口号的方式将非 SSL 页面重定向到 SSL 页面后身份验证?我在 Auth Digest 文档中找不到有关端口号的任何信息,但我推测这与原始 URI(来自浏览器请求或重写规则)有关。
答案1
基本身份验证可以在任何端口上进行。基本身份验证还会对特定资源进行身份验证,并且根本不涉及任何重定向:相反,它只是在密码对话框之后再次请求相同的 URL,但这次 HTTP 请求中包含凭据。由于基本身份验证不涉及重定向,这意味着您看到的重定向不是由身份验证引起的,而是在您的配置中的某个地方明确配置的。
答案2
我创建了一个最小的测试用例,思考就是答案。如果不是这种情况,或者这只是一个糟糕的黑客解决方法,请评论。
非 SSL 配置:
<VirtualHost *:80>
ServerName server.com
RewriteEngine On
RewriteRule ^/secret(.*)$ https://%{SERVER_NAME}:8443/secret [R=302,L]
RewriteRule ^/public(.*)$ https://%{SERVER_NAME}:8443/public [R=302,L]
</VirtualHost>
SSL 配置:
LoadModule ssl_module modules/mod_ssl.so
NameVirtualHost *:8443
Listen *:8443
<VirtualHost *:8443>
ServerName server.com:8443
UseCanonicalName On
SSLEngine on
# SSL cert/key
SSLCertificateFile /path/to/cert.crt
SSLCertificateChainFile /path/to/cert.chain.crt
SSLCertificateKeyFile /path/to/cert.key
DocumentRoot "/var/www"
<Directory "/var/www/public">
DirectoryIndex index.html index.php
Options -Indexes FollowSymlinks
Order allow,deny
Allow from all
</Directory>
<Directory "/var/www/secret">
DirectoryIndex index.php index.html
AuthName "Secret Pages"
AuthType Digest
AuthUserFile /etc/httpd/test-digests
Require valid-user
Options -Indexes FollowSymlinks
AllowOverride None
Order allow,deny
Allow from localhost.localdomain
Satisfy any
</Directory>
</VirtualHost>
请注意ServerName
SSL 配置中的行。如果我不将非标准端口放在那里,那么一旦输入用户名/密码,摘要重定向似乎就会使用标准 https 端口 443,这会导致我在原始问题中概述的行为。一旦端口在那里,行为就会符合要求。
因此,至少从这一点来看,如果 SSL 在非标准端口上运行,并使用 Digest(或者我猜是 Basic)Apache 身份验证,则必须在 ServerName 配置中指定端口。这是我在文档中没有看到的内容。