Apache 2.2重定向到SSL *然后* auth(解决方案<但它是废话?)

似乎是阿帕奇的地方,所以在这里:)

年龄老问题:那么我如何重定向HTTP-> HTTPS,那么并且只有在HTTPS的情况下进行身份验证?

噢 - 我希望它的大部分内容可以包含在多个<目录>或<位置>块中,因此没有虚拟主机级别的随机路径重写...

那么,这就是我所看到的似乎工作:

在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

加号

所有这些栏中的需求可以被抽象为一个片段文件以包含在每个位置的一行中

它修复了针对每个位置强制SSL和身份验证,从而减少错误的几率

血腥的地狱,它很不直观! 我知道的所有人都可能会变得脆弱......

有没有更好的方法(不是我找到的...)?

非常欢迎评论是否有任何严重缺陷:)

如果Apache有一个通用的配置语句, Aside Life会容易得多

<如果表达式> </ If>

可以在任何地方使用的块。 它具有某些特殊情况下的块,如IfModule,然后你有像RewriteCond这样的特殊情况条件(如果你不习惯的话,这很难理解)。

干杯,

蒂姆


如果你想强制整个网站使用https,你可以使用VirtualHost指令,然后它很简单:

<VirtualHost *:80>
    ServerName example.com

    RedirectMatch (.*) https://example.com$1

</VirtualHost>

<VirtualHost *:443>
    ServerName example.com

    ...
    ...
    ...
</VirtualHost>

Tim Watts的解决方案似乎对我最有效,但需要稍微调整一下。 此外,我的情况稍有不同,因为我希望允许某些不使用HTTP身份验证的IP地址,但这只是增加了一行。

默认情况下,mod_rewrite不会从VirtualHost继承配置。

请参阅:http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewriteoptions

我打算使用“RewriteOptions inherit”,但似乎这适用于父子规则后面的子规则。 无论如何,我想到了一个不同的解决方案。

在我的SSL <VirtualHost>内我有这样一行:

SetEnvIf Request_URI "/" using_ssl=yes

如果请求URI包含一个正斜杠(即所有的时间),那么这将设置using_ssl环境变量。这有点破解,因为我宁愿使用无条件的SetEnv,但显然:

此指令设置的内部环境变量是在大多数早期请求处理指令运行后设置的,例如访问控制和URI到文件名映射。 如果您正在设置的环境变量是输入到处理的早期阶段(如RewriteRule指令)的输入,则应该使用SetEnvIf设置环境变量。

(来源:http://httpd.apache.org/docs/2.2/mod/mod_env.html#setenv)

我的容器内的配置如下所示:

# Require a basic HTTP auth user
AuthName "realm-name-goes-here"
AuthType Basic
AuthUserFile /var/www/etc/htpasswd
Require valid-user

# OR allow from non-SSL (which will be redirected due to mod_rewrite below!)
Order Allow,Deny
Allow from env=!using_ssl

# OR allow from a trusted IP range
# NB: This allows certain IPs without a username & password
Allow from 192.168.0.0/16

Satisfy Any

# Force a redirect to HTTPS
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [L,R=permanent]

为了测试目的,您可能首先尝试使用'R'而不是'R = permanent'。

希望这对其他人有用:)


我已经测试过您的解决方案,但没有奏效。

经过漫长的搜索解决方案之后,Google搜索过多并且总是发现一些不起作用的东西,我最终做到了这一点:我使用SSLRequireSSLErrorDocument 403配置了一个包含JavaScript代码的静态页面(感谢此博客页面)。

/etc/apache2/conf.d.opt/redirect_if_not_https.conf

SSLRequireSSL
ErrorDocument 403 "<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
<script language="JavaScript">
window.location='https://'+window.location.hostname+window.location.pathname;
</script>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access that resource using simple HTTP. Please use HTTPS instead.</p>
</body></html>"

(注意我创建了/etc/apache2/conf.d.opt/

在app conf中,包含该文件(例如,在/etc/apache2/conf.d/trac.conf ):

<LocationMatch "/trac">
    # All the classical configurations here
    # ...

    Include conf.d.opt/redirect_if_not_https.conf
</LocationMatch>
链接地址: http://www.djcxy.com/p/53343.html

上一篇: Apache 2.2 redirect to SSL *then* do auth (with solution < but is it crap?)

下一篇: How to compile ASL (boost based Adobe C++ gui library) on linux?