【问题标题】:Force SSL/HTTPS with mod_rewrite [duplicate]使用 mod_rewrite 强制 SSL/HTTPS [重复]
【发布时间】:2010-11-22 17:06:48
【问题描述】:

我有一个 Zend 框架应用程序,我想使用 mod_rewrite 强制进入 HTTPS。当谈到 mod_rewrite 时,我很迷茫。这是我当前应用程序根目录中的 .htaccess 文件。

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-s
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule !\.(html|htm|php|js|ico|gif|jpg|png|css|csv)$ /subdir/index.php

根据我所拥有的,强制应用程序进入 HTTPS 的最佳方法是什么?我已经尝试了几个在这里找到的示例,但是当我尝试它们时,我不断收到重定向循环或内部服务器错误。

感谢您的帮助!

【问题讨论】:

  • 问题与 Zend Framework 无关。当您在 google 上搜索 zend 解决方案时会产生很多误导。应该重命名为“又一个 mod_rewrite 问题”

标签: mod-rewrite redirect ssl https


【解决方案1】:

以下解决方案适用于代理服务器和非代理服务器。因此,如果您正在使用 CloudFlare、AWS Elastic Load Balancing、Heroku、OpenShift 或任何其他 Cloud/PaaS 解决方案,并且您在正常的 HTTPS 重定向中遇到重定向循环,请给它一个试试看。

RewriteEngine On

# If we receive a forwarded http request from a proxy...
RewriteCond %{HTTP:X-Forwarded-Proto} =http [OR]

# ...or just a plain old http request directly from the client
RewriteCond %{HTTP:X-Forwarded-Proto} =""
RewriteCond %{HTTPS} !=on

# Redirect to https version
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

# Put the rest of your rewrite rules here

【讨论】:

  • 在使用 Cloudflare 灵活 SSL 时,此答案肯定 +1;所有其他解决方案似乎都会创建重定向循环
  • 在一个 wordpress 网站上工作,其中只有主页强制使用 https,而其他页面则允许使用 http。注意:我必须将此代码放在 .htaccess 中的 # BEGIN WordPress 之前才能使其正常工作。
  • 将其用于 Heroku。酷!
  • 我已经找了好几个小时了!非常感谢! :)
  • @raphinesse 你知道为什么正常的重定向会导致重定向循环吗?
【解决方案2】:

我也在寻找这个解决方案。我添加了 Gumbo 的解决方案,它对我很有用。但我的原作不一样。我的站点/应用程序重写通过 index.php 重定向所有内容(对于花哨的 url 和 ../application),您特别请求的文件除外。 (就像公共根目录中的图像或其他静态文件)这是我的原件,很久以前我在 ZF 网站上找到的。

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]

这里是 Gumbo 的附加规则,用于在整个网站上强制使用 SSL。到目前为止对我来说效果很好。

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]

【讨论】:

    【解决方案3】:

    将此规则放在您当前的规则之前:

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

    【讨论】:

    • 这里要注意的是“将此规则放在当前规则之前”。将此作为第一条规则。我的网站有几个重定向规则,并在第一个规则中制定了这个规则。
    【解决方案4】:
    
    RewriteEngine On
    RewriteCond %{SERVER_PORT} 80
    RewriteRule ^.*$ https://mydomain.com/\0 [L,QSA,R=301]
    

    【讨论】:

      猜你喜欢
      • 2011-05-22
      • 2013-07-27
      • 1970-01-01
      • 2017-08-22
      • 2015-07-05
      • 2012-01-20
      • 2020-09-06
      • 2018-05-12
      相关资源
      最近更新 更多