使用Auth和Canonical重定向在Apache上强制SSL

时间:2011-01-22 08:09:05

标签: apache .htaccess redirect rewrite authentication

我已经阅读了一些关于如何重定向到SSL的帖子,还有一些关于如何确保网站使用www子域/规范名称的帖子,以及一些关于如何设置Basic Auth的帖子。以下是我现在在.htaccess文件中的内容:

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]


RewriteEngine on
RewriteCond %{HTTP_HOST} !(^www\.site\.com*)$
RewriteRule (.*) https://www.site.com$1 [R=301,L]


AuthName "Locked"
AuthUserFile "/home/.htpasswd"
AuthType Basic
require valid-user

它工作得很好,但我想优化它。我的问题包括:

  1. 如何避免双重身份验证?当我访问网站w.o. SSL我必须进行身份验证,然后我被重定向到SSL并且必须再次进行身份验证。我可以重定向然后进行身份验证吗?
  2. 看起来第一条规则非常棒,因为我可以在任何网站上使用它而无需修改它。规则#2可以重写为与站点无关吗?即:无论域名是什么,它都会强制www在任何网站上使用(有更好的书面规则)? answered here
  3. 我如何使用适用于任何网站的规则来强制网站不使用www,即从www.site.com重定向到site.com? answered here

5 个答案:

答案 0 :(得分:5)

#1

如何避免双重身份验证?我可以重定向然后进行身份验证吗?

轰!这很有效。

SSLOptions +StrictRequire
SSLRequireSSL
SSLRequire %{HTTP_HOST} eq "www.askapache.com"
ErrorDocument 403 https://www.askapache.com/admin/

请参阅:

只需将上面的块放在.htaccess的顶部,这是我的:

SSLOptions +StrictRequire
SSLRequireSSL
SSLRequire %{HTTP_HOST} eq "www.askapache.com"
ErrorDocument 403 https://www.askapache.com/admin/

AuthType Digest
AuthName "Protected By AskApache"
AuthDigestDomain / https://www.askapache.com/admin/
AuthUserFile /home/askapache/.htpasswd-digest
Require valid-user
Satisfy All

答案 1 :(得分:3)

如果您使用的是Apache 2.4,则还可以使用configuration sections避免双重身份验证。

# Redirect to HTTPS
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

# Authenticate users only when using HTTPS
<If "%{HTTPS} == 'on'">
    AuthType Basic
    AuthName "Special things"
    AuthUserFile /etc/blah.htpasswd
    Require valid-user
</If>

我在answer here中提供了更精确的版本。

答案 2 :(得分:2)

对于#1:

仅在正在收听*:443 的VirtualHost上设置验证说明。您应该有2个VirtualHost,一个在端口80上侦听,另一个在端口443上。在非SSL通信上使用AuthType Basic是一个大问题,用户名和密码只是base64编码,所以它在清除在您的http服务器上使用的每个请求(甚至图像或css)!

答案 3 :(得分:1)

这是我的解决方案,以防止以前重写的双重身份验证,如:

RewriteCond %{HTTPS} ^off$ [NC]
RewriteCond %{REQUEST_URI} /administrator/*
RewriteRule ^(.*)$ https://%{SERVER_NAME}/$1 [R,L]


<If "%{HTTPS} == 'on'">
  AuthType       Basic
  AuthName      "Authorization Required"
  AuthUserFile   /var/www/vHost/etc/HTTP-Basic-Auth/htaccess-Users
  AuthGroupFile  /var/www/vHost/etc/HTTP-Basic-Auth/htaccess-Groups
  #require       valid-user
  require        group Webmins
</If>

<Else>
  ErrorDocument 403 /error/HTTP_FORBIDDEN.html.var
</Else>

即使我不是真的需要这种条件 - 如果Rewrite由于某种原因不能正常工作,那么它就更多地作为额外的安全性后备。

答案 4 :(得分:0)

感谢上面的回复,它有助于创建组合的https和www解决方案。我唯一担心的是,如果某些情况下没有触发auth,允许某人在没有凭据的情况下进行访问。我不确定有没有,但也许你们聪明的人可能会说不出来。

此代码使用.htaccess文件夹身份验证将非www重定向到www,http重定向到https。

这是您要保护的目录中htaccess文件的内容:

RewriteEngine on
# ensure www.
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/foldername/$1 [L,R=301]
# ensure https
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} !=on [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}/foldername/$1 [L,R=301]

# Apache 2.4 If
<If "%{HTTPS} == 'on' && %{HTTP_HOST} =~ /www/">
AuthType Basic
AuthName "Protected folder"
AuthUserFile "/home/etc/.htpasswds/public_html/foldername/passwd"
require valid-user
</If>