使用 .htaccess 将 http 重定向到 https 时,某些 url 会出现奇怪的 401 错误

2024-01-08

好的,这是尝试寻找 401 错误原因的失败尝试的第 7 天...

现在, 根文件夹中的 .htaccess 仅包含 3 个字符串(已简化),并且项目中不再有 .htaccess 文件:

RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

因此,它将所有请求重定向为 https。它适用于任何 url,甚至适用于 /administration 目录。

So,

http://mydomain.com

becomes

https://mydomain.com

If https://mydomain.com输入后,没有重定向。

http://mydomain.com/administration/index.php

becomes

https://mydomain.com/administration/index.php

If https://mydomain.com/administration/index.php输入后,没有重定向。

这很清楚,问题在下面。

我希望 /administration 目录受到密码保护。我的共享主机控制面板允许保护目录,而无需手动创建 .htaccess 和 .htpasswd(您选择要保护的目录,创建用户名和密码,然后自动创建 .htaccess 和 .htpasswd)。因此,.htaccess 出现在 /administration 文件夹中。 .htpasswd 出现在其他地方,.htpasswd 的路径是正确的,并且一切看起来都是正确的(其工作方式与手动创建它相同)。因此,项目中有 2 个 .htaccess 文件,一个位于根目录,一个位于 /administration 目录(其中 .htpasswd 位于目录 .htaccess 知道它在哪里)。

创建密码后, 结果是:

您输入:

https://mydomain.com/administration/index.php

然后它要求输入密码。 如果输入正确的话https://mydomain.com/administration/index.php被展示。结果:效果完美。

但是,如果你输入 http://mydomain.com/administration/index.php(是的,http,没有S) 然后不是重定向到相同的 https 页面, 它重定向到

https://mydomain.com/401.shtml (starts with httpS)

由于未知原因,甚至不询问密码。Why?

我已经就这个问题联系了客户支持,他们确定问题出在 .htaccess 文件中,并且他们不修复 .htaccess 文件(很明显,他们不修复,我不介意)。

为什么会出现这种情况? 我是否忘记在 .htaccess 文件中放置一些标志或一些选项来更改默认设置?

P.S. 如果输入的不是 https,而是 http,则为文件夹 /administration 手动创建 .htaccess 和 .htpasswd(不是从托管控制面板)会导致相同的 401 错误。

仅当 URL 指向 /administration 目录时才会出现此问题。

谢谢。


尝试使用这个代替。不是 L 和 R 标志。

RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

还要先清除浏览器缓存,以删除旧的不正确的重定向。

如果这不起作用,请尝试使用这个。

RewriteCond %{HTTPS} !on
RewriteCond %{THE_REQUEST} ^(GET|HEAD)\ ([^\ ]+)
RewriteRule ^ https://%{HTTP_HOST}%2 [L,R=301]

我觉得写它有点不好,因为在我看来这有点黑客。

EDIT看来第二个选项解决了问题。所以这里是关于它为什么起作用的解释。

认证模块在重写模块之前执行。由于首次请求页面时未发送用户名和密码,因此身份验证模块会在内部将请求 url“重写”为 401 页面的 url。在 mod_rewrite 到来之后,%{THE_REQUEST} 现在包含401.shtml而不是原来的网址。因此,生成的重定向包含 401.shtml,而不是您想要的 url。

要获取原始(不是“重写”)的 url,您需要从 %{THE_REQUEST} 中提取它。 THE_REQUEST 的形式为[requestmethod] [url] HTTP[versionnumber]。 RewriteCond 仅提取中间部分([url]).

为了完整起见,我添加了[L,R=301]标记为第二个解决方案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 .htaccess 将 http 重定向到 https 时,某些 url 会出现奇怪的 401 错误 的相关文章

随机推荐

  • Cocos2d-x - 如何将CCLayer的一部分设置为透明?

    我是新手cocos2d x我需要你的帮助 我需要使图层的触摸部分透明 如何使图层的一部分透明 我曾想过使用 ClippingNode 但我找不到示例或文档 我使用C 谢谢 在所有cocos2d x版本中添加的TestCpp项目中 您可以找到
  • java 清单类路径与-classpath

    我试图找出可执行 jar 文件的一个奇怪问题 xyz jar 在清单文件 中有一个类路径 并且依赖于 abc jar 库 不幸的是 xyz jar 中的清单类路径不正确 为了避免灾难 我正在更新执行命令以使用 java classpath
  • 为什么 this.evaluate 不能正确返回 DOM 节点?

    我试图通过以下方式从网页获取对象evaluate 方法 这样我就可以在范围之外使用它evaluate 使用名称选择的元素symbol is a
  • “不存在”和“不存在”有什么区别?

    有什么区别not in and not exists在 Oracle 查询中 我什么时候使用not in And not exist 和 之间的不同NOT IN and 不存在变得清楚哪里有NULL结果中包含的值 例如 create tab
  • 使用硬件加速的自定义 Android 视图中的部分失效

    我的应用程序中有一个自定义视图 它填充了整个活动 在大多数情况下 当我想刷新控件时我调用invalidate 没有任何参数 但是 在某些情况下 我只更改控件的一小部分区域 我会调用invalidate Rect 以避免重绘整个屏幕 这很重要
  • 向 JTable 和数据库 (phpMyAdmin) 添加一行?

    initComponents try ResultSet res statement executeQuery SELECT FROM banh ResultSetMetaData RSMD res getMetaData NumberOf
  • 如何在 Xamarin.Forms 中删除(Android)应用程序标题栏?

    我是否可以在 Xamarin Forms 中删除应用程序的标题栏 我正在开发 Xamarin Forms Portable 项目 我尝试了很多解决方案 但都不起作用 我什至无法启动应用程序 第一次尝试我尝试将其添加到我的 AndroidMa
  • TypeScript:为同一项目中的不同文件声明不同的库/引用

    我有一个用 TypeScript 编写的项目 我同时使用 dom 和 Web Workers 因此我在某些文件中需要 webworker d ts 库 在其他文件中需要 dom d ts 我已经尝试将 webworker 添加到 tscon
  • Dynamo DB 中的自动递增计数器

    我正在尝试在 dynamo 数据库中实现哈希键的自动递增计数器 但我的代码对于并发事务失败 任何帮助实现该功能的帮助将不胜感激 我是堆栈溢出的新手 可能无法正确指定它 任何实施都会有所帮助 您有两种选择 使用 dynamo db 原子计数器
  • YAML 媒体类型?

    通过 HTTP 发送使用 YAML 构建的数据时最合适的媒体类型 正式的 MIME 类型 是什么 为什么 没有已注册的应用类型 http www iana org assignments media types application or
  • 为什么在单独的模型文件中使用 model.export ?

    在查看一些有关拆分模型数据的 Stackoverflow 答案时 我看到了两种不同的格式 见下文 var UserSchema mongoose Schema name String module exports mongoose mode
  • Java 是否可以在运行时实现接口?

    我正在开发一个项目 其中有很多由库创建的对象 并且我无法访问这些对象的创建过程 以下片段是说明我的问题的一个很好的例子 Code public class Clazz The contents of Clazz are irrelevant
  • Haskell:在 WinGHCi 中卸载模块

    我加载了两个模块 NecessaryModule1 hs 和 NecessaryModule2 hs 中的链接 Haskell 加载当前目录路径中的所有文件 https stackoverflow com questions 1026869
  • 用于多个文件上传验证的 jQuery Validate 插件

    我有一个文件上传字段 可以选择和上传多个文件 我正在使用 jquery Validate 插件进行字段验证 对于单个文件上传 我可以成功利用此插件功能 但我不知道如何将其与多个文件一起使用文件上传归档 这是我的html
  • CarrierWave 并将大小调整为特定宽度

    在 Rails 3 0 中使用 CarrierWave 您将如何编写代码 将宽度大于 500 像素的图像调整为 500 像素宽 并适当调整高度 保持相同的初始宽高比 您可以使用 process resize to limit gt 500
  • Jest/React 模拟滚动和 .getBoundingClientRect 函数

    我有一个函数handleClick 它在一个元素上使用scrollBy 该元素使用getBoundingClientRect 获取其第一个参数 我正在尝试使用笑话 酶来测试这一点 class myClass extends Componen
  • 在 Notepad++ 中合并文件

    是否有一个 Notepad 插件可以自动将所有当前打开的文件合并到一个文件中 Update 是的 我非常了解复制和粘贴 我正在处理大量文件 并且我想要一个解决方案 使该过程中的这一步比几十次复制和粘贴快一点 我知道用于组合文件的实用程序 但
  • 将列表传递给另一个 jsp 文件

    我想将主 JPS 中的 List 类型对象传递给包含 JSP jsp include 由于 parm 仅支持字符串 因此我无法使用 parm 标记将 List 类型数据传递到包含文件 使用示例
  • 为什么我会收到错误:RPC 失败; result=52, HTTP code = 0 fatal: 推送到github时远端意外挂断?

    我创建了一个新的存储库github并想推送一些文件 所以我像平常一样初始化存储库并执行git add 添加当前目录 这是我的java项目文件夹与bin and src文件夹内 然后我使用以下命令添加了远程目录 git remote add
  • 使用 .htaccess 将 http 重定向到 https 时,某些 url 会出现奇怪的 401 错误

    好的 这是尝试寻找 401 错误原因的失败尝试的第 7 天 现在 根文件夹中的 htaccess 仅包含 3 个字符串 已简化 并且项目中不再有 htaccess 文件 RewriteEngine On RewriteCond HTTPS