首页 文章

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

提问于
浏览
4

我已经阅读了一些关于如何重定向到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

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

  • 如何避免双重身份验证?当我访问网站w.o. SSL我必须进行身份验证,然后我被重定向到SSL并且必须再次进行身份验证 . 我可以重定向然后进行身份验证吗?

  • 看起来第一条规则非常棒,因为我可以在任何网站上使用它而无需修改它 . 规则#2可以重写为与站点无关吗?即:无论域名是什么,它都会强制www在任何网站上使用(有更好的书面规则)? answered here

  • 我如何使用适用于任何网站的规则来强制网站不使用www,即从www.site.com重定向到site.com? answered here

5 回答

  • 2

    对于#1:

    设置 Auth 指令 *only on the VirtualHost which is listening on :443 . 您应该有2个VirtualHost,一个在端口80上侦听,另一个在端口443上 . 在非SSL通信上使用 AuthType Basic 是一个大问题,用户名和密码只是base64编码,所以在每个请求(甚至图像或css)上都是 clear 在您的http服务器上使用!

  • 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
    
  • 2

    如果您使用的是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中给出了一个更精致的版本 .

  • 0

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

    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由于某种原因不起作用,它会更多地作为额外的安全性回退 .

  • 1

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

    此代码使用.htaccess文件夹auth将非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>
    

相关问题