如何在 Apache 中为 HTTP 基本身份验证响应设置 Access-Control-Allow-Origin 标头?

hek*_*ran 3 apache webserver apache-config basic-authentication

我想使用 XHR 登录到使用 HTTP 基本身份验证的站点。下面的作品就是这样做的。

http = new XMLHttpRequest();
http.open("get", "http://...", false, username, password);
http.send("");
Run Code Online (Sandbox Code Playgroud)

问题是,这并没有从一个域是从一个地方认证是不同的工作。解决方案很简单:将 Access-Control-Allow-Origin 标头设置为 *. 所以我将我的 Apache 配置更改为:

<Location />
    Header set Access-Control-Allow-Origin "*"

    AuthType Basic
    AuthName "trac"
    AuthUserFile /home/admin/development/pass.htpasswd
    Require valid-user
</Location>
Run Code Online (Sandbox Code Playgroud)

该页面的响应如下所示:

HTTP/1.1 401 Authorization Required
Connection: Keep-Alive
Content-Encoding: gzip
Content-Length: 345
Content-Type: text/html; charset=iso-8859-1
Date: Sun, 11 Sep 2011 01:17:55 GMT
Keep-Alive: timeout=15, max=100
Vary: Accept-Encoding
WWW-Authenticate: Basic realm="trac"
Run Code Online (Sandbox Code Playgroud)

响应没有 Access-Control-Allow-Origin 标头。这看起来很奇怪。

当我对内页使用相同的 Header 指令时,设置了标题。

为什么没有设置标题?如何在 Apache 中为 HTTP 基本身份验证响应设置 Access-Control-Allow-Origin 标头?

reg*_*ero 5

答案是:

Header always set Access-Control-Allow-Origin "*"
Run Code Online (Sandbox Code Playgroud)

代替

Header set Access-Control-Allow-Origin "*"
Run Code Online (Sandbox Code Playgroud)

原因在Header 指令文档中

Header [condition] set|append|merge|add|unset|echo|edit header [value] [replacement] [early|env=[!]variable]

可选条件参数确定该指令将针对哪个内部响应标头表进行操作。服务器的其他组件可能已经将它们的响应头存储在对应于 onsuccess 的表或对应于 always 的表中。在此上下文中,“始终”是指在成功和不成功响应期间是否会发送您添加的标头,但如果您的操作是现有标头的函数,则必须继续阅读以了解进一步的复杂性。

在类似于下面列出的情况下,可能需要将 onsuccess 的默认值更改为始终。另请注意,在某些情况下,在两个条件下重复此指令是有意义的,因为对于现有标头而言,始终不是 onsuccess 的超集:

  • 您正在向非成功(非 2xx)响应(例如重定向)添加标头,在这种情况下,最终响应中仅使用与 always 对应的表。
  • 您正在修改或删除由 CGI 脚本生成的标题,在这种情况下,CGI 脚本位于与 always 相对应的表中,而不是在默认表中。
  • 您正在修改或删除由服务器的某些部分生成的标头,但默认的 onsuccess 条件找不到该标头。

在您的情况下,您发送的是401响应而不是经典的 200 响应,并且如果您不使用关键字,则仅将 Header 设置为200响应always