在 htaccess 中确定 HTTPS 以设置环境

Posted

技术标签:

【中文标题】在 htaccess 中确定 HTTPS 以设置环境【英文标题】:Determine HTTPS in htaccess to Set Environment 【发布时间】:2014-05-03 21:54:36 【问题描述】:

只有当请求是“https”时,我才想将用户重定向到身份验证页面。

目前我已经在我的 .htaccess 文件中编写了以下内容来做同样的事情,但它不起作用。

SetEnvIf Request_Protocol ^HTTPS.* IS_HTTPS

AuthType shibboleth
AuthName "Login"
ShibRequireSession on
require user abcd
Allow from env=IS_HTTPS

确定 HTTPS 的正则表达式是否正确?早些时候我有如下的 SetEnvIf 语句。这也没有奏效。

SetEnvIf %SERVER_PORT ^80$ IS_NON_SSL

AuthType shibboleth
AuthName "Login"
ShibRequireSession on
require user abcd
Allow from env=!IS_NON_SSL

但根据 SetEnvIf 指令 (http://httpd.apache.org/docs/2.2/mod/mod_setenvif.html) 的文档,SERVER_PORT 变量不可用。

【问题讨论】:

【参考方案1】:

我不认为值 Request_Protocol 可以用来确定这一点 - 根据您链接的文档页面,其中包含类似 的内容(例如,“HTTP/0.9”、“HTTP/1.1” ,等等)——所以协议本身总是HTTP;这是有道理的,因为HTTPS 不是真正的“协议”,而只是 HTTP 的通用名称,并在其下方的 OSI 级别上“包裹”了 TLS (6)。

我不确定请求处理的实际顺序(我现在不知道在哪里可以找到它)——但也许你可以将它与 mod_rewrite 结合起来以实现你想要的? RewriteCond 能够通过检查变量 HTTPS 的值 on 来检查是否使用了 HTTPS - 并且遵循该条件的 RewriteRule 可以使用 [E] 标志为您设置环境变量 - 类似于这个:

RewriteCond %HTTPS ^on$
RewriteRule . - [E=IS_HTTPS]

这会将环境变量 IS_HTTPS 设置为空值,但这应该足以使用Allow from env=IS_HTTPS 进行检查。

介意试试这个吗?正如我所说,我不确定这是否会因为处理订单而起作用 - 但尝试花费 nuffin,对吧?

【讨论】:

【参考方案2】:

你可以试试:

SetEnvIf Request_Protocol ^HTTPS.* IS_HTTPS

AuthType shibboleth
AuthName "Login"
ShibRequireSession on
require user abcd
Satisfy    any
Order      deny,allow
Deny from  all
Allow from env=IS_HTTPS

【讨论】:

执行此操作时出现内部服务器错误。知道我做错了什么吗? 嗯,你能检查一下 Apache error.log 看看是什么错误吗? 我没有查看日志的权限。将要求相同并回复您。谢谢。

以上是关于在 htaccess 中确定 HTTPS 以设置环境的主要内容,如果未能解决你的问题,请参考以下文章

如何在 .htaccess 中创建别名以直观地隐藏 URL 的目录路径

两个版本的.htaccess 301重定向

如何仅在 HTTPS 上从 .htaccess 设置 HSTS 标头 [关闭]

输入密码以解锁密钥环

htaccess 重写以包含 #!

htaccess 重写以包含 #!