似乎是 apache 的地方,所以这里是 :)
古老的问题:我如何重定向 HTTP-> HTTPS,然后且仅当 HTTPS 时才进行身份验证?
哦 - 我希望它的大部分都在一个片段中,可以包含在多个 <directory> 或 <location> 块中,所以没有虚拟主机级别的基于随机路径的重写......
好吧,这就是我所拥有的似乎确实有效的东西:
在 VirtualHost 块的顶部
# Set ssl_off environment variable
RewriteEngine on
RewriteCond %{HTTPS} =on
RewriteRule ^ - [E=ssl]
在位置或目录块中
RewriteEngine on
# Case 1 redirect port 80 SSL
RewriteCond %{HTTPS} !=on
RewriteCond %{SERVER_PORT} =80
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [R=301]
AuthType Basic
AuthBasicProvider external
AuthExternal auth_pam
AuthName "My Underpants"
AuthzUnixgroup on
Order Deny,Allow
Deny from all
Allow from env=!ssl
Satisfy any
Require group nice-users
优点
Require 的所有条都可以抽象为一个片段文件,以包含在每个位置的一行中
它修复了对每个位置强制 SSL 和身份验证,因此出错的机会更少
缺点
该死的地狱,这几乎不直观!据我所知,可能很脆弱...
有没有更好的方法(不是我发现的......)?
非常欢迎评论这是否有任何严重的缺陷:)
如果 Apache 有一个合理的配置语法和泛型 ,那么生活会容易得多
<If 表达式> </If>
可以在任何地方使用的块。它具有某些特殊情况块,例如 IfModule,然后您有特殊情况条件,例如 RewriteCond(如果您不习惯它,很难理解)。
干杯,
蒂姆