【问题标题】:Determine HTTPS in htaccess to Set Environment在 htaccess 中确定 HTTPS 以设置环境
【发布时间】: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 变量不可用。

【问题讨论】:

    标签: regex apache .htaccess mod-rewrite httpd.conf


    【解决方案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 看看是什么错误吗?
      • 我没有查看日志的权限。将要求相同并回复您。谢谢。
      猜你喜欢
      • 2019-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多