通过 htaccess http 到 https 重定向:不正确的重定向错误

2023-12-26

我需要将所有 HTTP 请求重定向到 HTTPS:

RewriteEngine On
RewriteBase /

RewriteCond %{HTTP_HOST} !^some-domain\.com$ [NC]
RewriteRule ^(.*)$ https://some-domain.com/$1 [R=301,L]

RewriteCond %{THE_REQUEST} /(\.+) [OR]
RewriteCond %{THE_REQUEST} /(\?+) [OR]
RewriteCond %{THE_REQUEST} /(/+)
RewriteRule ^(.*)$ 404.html [L]
RewriteRule ^core/(install|temp|smarty|modules|languages|includes|functions|fonts|files|config|classes|cache|backup|tpl)/(.*) - [F]
RewriteRule ^data/(.+)\.(tpl\.html|php|php3|php4|php5|phtml|pl|cgi) - [F]
RewriteRule ^install_check\.html$ install.php?check=yes [L]
RewriteRule ^index\.html$ index.php [L]
RewriteRule ^news\.html$ index.php?news=yes [L]
RewriteRule ^price\.html$ index.php?show_price=yes [L]
RewriteRule ^cart\.html$ index.php?shopping_cart=yes [L]
RewriteRule ^wide_search\.html$ index.php?search_with_change_category_ability=yes [L]
RewriteRule ^feedback\.html$ index.php?feedback=yes [L]
RewriteRule ^compare\.html$ index.php?comparison_products=yes [L]
RewriteRule ^page_([0-9]+)\.html$ index.php?show_aux_page=$1 [L]
RewriteRule ^product_([0-9]+)\.html$ index.php?productID=$1 [L]
RewriteRule ^category_([0-9]+)\.html$ index.php?categoryID=$1 [L]
RewriteRule ^category_([0-9]+)_offset_([0-9]+)\.html$ index.php?categoryID=$1&offset=$2 [L]
RewriteRule ^category_([0-9]+)_show_all\.html$ index.php?categoryID=$1&show_all=yes [L]
RewriteRule ^show_news_([0-9]+)\.html$ index.php?fullnews=$1 [L]

# BEGIN Articles
RewriteRule ^poleznoe/([^/]+)\.html$ index.php?fullarticles=$1 [L]
RewriteRule ^poleznoe/([0-9]+)/$ index.php?articles=yes&offset=$1 [L]
RewriteRule ^poleznoe/$ index.php?articles=yes [L]
# END Articles

RewriteRule ^google([a-z0-9_-]+).html$ google$1.html [L]
RewriteRule ^yandex([a-z0-9_-]+).html$ yandex$1.html [L]

# BEGIN Human friendly URL's
RewriteRule ^news/([^/]*).html$ index.php?uri=$1&uriFor=news [L]
RewriteRule ^([^/]*).html$ index.php?uri=$1&uriFor=pages [L]
RewriteRule ^([^/]*)/$ index.php?uri=$1&uriFor=category [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !([^/]*)/$
RewriteRule ^([^/]*)$  $1/ [L,R=301]
RewriteRule ^(([^/]*)_offset_([0-9]+))/$ index.php?uri=$1&uriFor=category&offset=$2 [L]
RewriteRule ^([^/]*)_show_all/$ index.php?uri=$1&uriFor=category&show_all=yes [L]
#RewriteRule ^([^/]*)/([^/]*)/([^/]*)\.html$ index.php?uri=$3&uriFor=product [L]
RewriteRule ^([^/]*)/([^/]*)\.html$ index.php?uri=$2&uriFor=product [L]
# END Human friendly URL's

我用谷歌搜索并多次遇到这个解决方案:

RewriteCond %{HTTPS} off
RewriteRule ^.*$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

但如果我把它放在之后RewriteEngine On或之后RewriteBase /或附近或之间的任何地方

RewriteCond %{HTTP_HOST} !^some-domain\.com$ [NC]
RewriteRule ^(.*)$ https://some-domain.com/$1 [R=301,L]

当我加载页面时,它给我一个不正确的重定向错误。请告诉我我做错了什么。


$_SERVER['HTTPS']总是空的,但是$_SERVER['HTTP_X_FORWARDED_PROTO']当我在 https 页面时返回 https

这告诉您,您的 SSL 是由前端代理服务器管理的,而不是您的应用程序服务器。您的应用程序服务器似乎没有安装 SSL 证书,并且很可能通过端口 80 向代理服务器提供普通 HTTP 请求。然后,代理服务器将安全的 HTTPS 响应返回给客户端,因此客户端请求是安全的。

这意味着如果你的应用服务器尝试通过简单地检查标准服务器变量(即HTTPS or SERVER_PORT)那么这可能会因重定向循环而失败,因为HTTPS总是off and SERVER_PORT始终为 80 - 即使在重定向之后也是如此。 (请注意,HTTPSApache 变量可能处于“关闭”状态,但这通常会转换为 PHP 超全局变量$_SERVER['HTTPS']那是empty- 这就是 PHP 处理它的方式。)

请注意,HTTP 到 HTTPS 的重定向可以在前端代理中执行,甚至在它到达应用程序服务器之前。 (Cloudflare 通过其页面规则.)

或者,您可以检查代理服务器在请求时设置的附加 HTTP 请求标头转发的从代理到您的应用程序服务器。这X-Forwarded-Protoheader(由 PHP 存储为$_SERVER['HTTP_X_FORWARDED_PROTO'])由代理服务器设置,告诉您客户端使用什么协议连接到您的代理。

因此,将规范重定向结合在一起:

# www to non-www redirect
RewriteCond %{HTTP_HOST} !^example\.com
RewriteRule (.*) https://example.com/$1 [R=301,L]

# http to https redirect
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

根据您发布的指令的格式,www 到非 www 的重定向应该首先出现,以避免请求时出现双重重定向http://www.example.com(即 HTTP 和 www)。

请注意,只有当您位于处理 SSL 的代理服务器后面时,才应使用这种类型的 HTTP 到 HTTPS 重定向。否则,X-Forwarded-ProtoHTTP 请求标头可能会被恶意客户端请求伪造(但是,这应该由您的代理服务器处理)。


如果您愿意,可以将这两条规则合并为 1 条规则:

# Canonical redirect (no-www and HTTPS)
RewriteCond %{HTTP_HOST} !^example\.com [OR]
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://example.com/$1 [R=301,L]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过 htaccess http 到 https 重定向:不正确的重定向错误 的相关文章

随机推荐

  • 如何防止 Android 返回对我的 HTTP 请求的缓存响应?

    我正在编写一个客户端 它对随时间变化的 xml 数据发出重复的 http 请求 看起来 Android 堆栈正在缓存我的页面请求并重复返回同一页面 如何确保每次都会获得新页面 代码 HttpClient client new Default
  • 中心文本大于容器? (不使用单独的子元素)

    使用 CSS 可以轻松地将文本在容器中水平居中text align center 但如果该文本中的任何一个单词是大于容器的宽度 浏览器会自动 剪辑 到容器的左边界 例如 过大的单词与过小的容器的左侧对齐 并且没有 CSSword break
  • .dockercfg 文件应如何托管在 Mesosphere-on-AWS 设置中,以便只有 Mesosphere 可以使用它?

    我们已经在 AWS 上的私有 VPC 中使用 Mesosphere 设置了一个测试集群 我们有一些公开的 Docker 镜像 很容易部署 然而 我们的大多数服务都是私有镜像 托管在 Docker Hub 私有计划上 并且需要身份验证才能访问
  • 使用 GIT 在本地服务器和实时服务器之间同步网站文件?

    假设我有两台 Web 服务器 一台是本地开发的 一台是实时的 在 SVN 下 我会将网站文件检出到本地网络服务器的 public html 目录以及实时网络服务器的 public html 目录 然后 我将直接在本地服务器上处理文件 并将任
  • 角色与声明授权 Asp.net web api-2 与 WIF 和 OWIN 中间件

    我正在尝试使用 Windows Identity Foundation 2 保护 asp net web api 2 0 我必须在基于角色的授权和基于声明的授权之间做出选择 作为练习 我添加了一个用户DbInitializer并为他分配了两
  • 使用 Javascript 更改网页的标题 [重复]

    这个问题在这里已经有答案了 可能的重复 如何动态改变网页的标题 https stackoverflow com questions 413439 how to dynamically change a web pages title 我正在
  • 从 Rails 应用程序检索客户端系统信息

    是否可以从 Ruby on Rails 应用程序检索客户端计算机的 CPUID 和 MAC 地址 有可用的插件吗 我很确定不可能通过 Rails 应用程序解析客户端计算机的 proc 文件系统 感谢上帝 你可以做的就是在某种程度上使用Jav
  • 如何估计 Lucene 索引的大小?

    是否有已知的数学公式可用于估计新 Lucene 索引的大小 我知道我想要索引多少个字段 以及每个字段的大小 而且 我知道有多少项目将被索引 那么 一旦这些被 Lucene 处理后 它是如何转换成字节的呢 这里是lucene索引格式文档 ht
  • Gnuplot x tic 标签重叠

    我正在从具有以下格式的数据文件绘制 gnuplot 图表 01 value 1 1 value 2 1 02 value 1 1 value 2 1 01 value 1 n value 2 n 使用该命令 plot action dat
  • Python安装错误:NumPy包

    我正在尝试遵循本教程 http newcoder io dataviz part 0 当我执行以下操作时出现错误 DataVizProject pip install r requirements txt 它给了我一个很大的错误日志 其中最
  • Laravel Eloquent ORM 与 Query builder 哪一个更好?

    谁能告诉我 ORM 或查询生成器哪一个更好 它有什么好处 我们使用 Laravel 等框架来简化我们的工作 当谈到框架的概念时 开发的速度和易用性比性能更重要 因此 通过使用 ORM 它提供了强大的方法来处理数据库 而不需要大量的 mysq
  • 清除 setTimeout 的数组

    好吧 我的 AJAX 应用程序中有一个功能 它会在一段时间后在角落里粘贴一个工具提示 以帮助提示用户他们正在做什么 还有第二个函数 如果用户单击其他地方 则清除超时 因为该工具提示将不再相关 我现在开始遇到关于超时设置多个工具提示的问题 设
  • 如何在 Dart 单元测试中模拟或验证打印调用?

    在我的 Dart 单元测试中 如何验证 print 被调用 我正在为教程编写示例代码 我想测试它 许多样本使用print为了简单起见 我希望我的单元测试能够验证是否使用正确的输入调用了 print Thanks Update 区域规格 ht
  • 在关系代数中,SQL 表关系的等价物是什么?

    如果我理解正确的话 关系代数相当于一个SQL table is a relation 中的等效术语是什么关系代数 of a SQL relationship 即在两个表之间 两个表或关系之间的 关系 原文如此 是伪 ERM 实体关系模型 信
  • 我想进行 mongodb 聚合查找以将程序数组 module_id 与下面用户集合中的 module_attempts 键连接起来

    这是当前的收藏 collection users id ObjectId 63ab0d0ed5e1b9566e0a2632 created at ISODate 2022 12 27T20 49 42 350 05 30 programs
  • php 7 中的 mysql 支持

    我有一个巨大的产品 是在php5 5上开发的 所以查询是使用mysql编写的 由于PHP 7 gt 已经取消了对mysql的支持 现在我被迫使用mysqli来代替 但这会消耗我太多的时间 是否有任何临时解决方案可以使 mysql 查询在 P
  • JNI 访问的代码中的纯 C++ 对象

    我的 Android 应用程序有一个本机 C 层和一个 Java 层 Java层通过JNI调用访问native层 C 层能否安全地创建C 对象供自己内部使用 并将它们存储在C 成员变量中 我说的是不需要 Java 代码以任何方式访问的 C
  • Tomcat 8 启用调试日志记录以列出不需要的 jar

    在 Arch Linux ARM 上启动 Tomcat 8 时 我收到以下警告 信息 至少扫描了一个 JAR 的 TLD 但不包含 TLD 启用此记录器的调试日志记录 以获得 JAR 的完整列表 已扫描 但未在其中发现 TLD 跳过不需要的
  • 如何在开始目的地隐藏工具栏

    我试图隐藏开始片段中的工具栏 但是View GONE当我在 navigationUI 中显式设置工具栏时不起作用 mainActivity class MainActivity AppCompatActivity private latei
  • 通过 htaccess http 到 https 重定向:不正确的重定向错误

    我需要将所有 HTTP 请求重定向到 HTTPS RewriteEngine On RewriteBase RewriteCond HTTP HOST some domain com NC RewriteRule https some do