如何在 Apache Location 上强制使用 SSL(https)

如何在 Apache Location 上强制使用 SSL(https)

我正在尝试在 mod_dav_svn 提供的 SVN 存储库上强制使用 SSL (https)。以下是我所拥有的:

<Location /svn/projectname>
  DAV svn
  SVNPath /var/repo/projectname
  Require valid-user
  AuthType Basic
  AuthName "Subversion repository"
  AuthUserFile /etc/svn-auth-projectname

  #here's what I tried (didn't work)
  SSLCipherSuite HIGH:MEDIUM
</Location>

但是,当我通过 http 登录时,不会被重定向到 https;它停留在 http。为什么上述方法不起作用?如何让此 https 重定向起作用?

我见过关于使用 mod_rewrite 的建议,例如:

# /dir/.htaccess
RewriteEngine on
RewriteCond %{SERVER_PORT}!443
RewriteRule ^(.*)$ https://www.x.com/dir/$1 [R,L] 

但是,我不明白它到底有什么用,所以我不敢使用它。另外,它看起来更像是一个丑陋的黑客,而不是正确的解决方案。

答案1

这不是黑客行为。下面为您快速分析一下:

# Turn on Rewriting
RewriteEngine on 

# Apply this rule If request does not arrive on port 443
RewriteCond %{SERVER_PORT} !443 

# RegEx to capture request, URL to send it to (tacking on the captured text, stored in $1), Redirect it, and Oh, I'm the last rule.
RewriteRule ^(.*)$ https://www.x.com/dir/$1 [R,L]

答案2

我们使用的语法略有不同,但基本相同。我们检查是否未使用 HTTPS,而不是检查接收请求的端口。我们使用%{HTTP_HOST}环境变量,而不是硬编码主机名。

  RewriteEngine              On
  RewriteCond     %{HTTPS}   Off
  RewriteRule     .*         https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

我更喜欢这种方法,因为它在 Apache 监听非标准端口时有效。%{HTTP_HOST}如果您的网站位于代理后面,则使用可能会出现问题,但我们尚未尝试过。

答案3

尝试

 <Location />
    SSLRequireSSL
 </Location>

答案4

除了已经提到的重定向之外,您可能还想添加SSLRequireSSL 指令你的地点如果您不使用 HTTPS 连接,容器将拒绝访问。但是,使用仅侦听 *:443 的 SVN 站点的 VirtualHost 解决方案更为优雅。

相关内容