使用 mod_rewrite 强制 SSL/HTTPS [重复]

Posted

技术标签:

【中文标题】使用 mod_rewrite 强制 SSL/HTTPS [重复]【英文标题】:Force SSL/HTTPS with mod_rewrite [duplicate] 【发布时间】: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 问题” 【参考方案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]

【讨论】:

以上是关于使用 mod_rewrite 强制 SSL/HTTPS [重复]的主要内容,如果未能解决你的问题,请参考以下文章

为啥在通过 mod_rewrite 强制 HTTPS 时不发送 301 重定向?

Apache mod_rewrite:仅当不在本地主机中时才强制 www

如果 .htaccess 使用 mod_rewrite,则 Apache httpd.conf mod_rewrite 取消

Apache - 添加虚拟目录后无法再使用 mod_rewrite

强制 SSL 重定向 - Apache/IHS RewriteCond 和 RewriteRule

有没有办法强制 apache 返回 404 而不是 403?