繁体   English   中英

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

[英]How do you set the Access-Control-Allow-Origin header for the HTTP basic authentication response in Apache?

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

http = new XMLHttpRequest();
http.open("get", "http://...", false, username, password);
http.send("");

问题是,这不适用于与身份验证所在域不同的域。 解决方案很简单:将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>

该页面的回复如下:

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"

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

当我对内部页面使用相同的Header指令时,将设置标头。

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

答案是:

Header always set Access-Control-Allow-Origin "*"

代替

Header set Access-Control-Allow-Origin "*"

原因在于Header指令文档

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

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

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

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

在您的情况下,您发送401响应而不是传统的200响应,如果您不使用always关键字,则仅在200响应上设置标头。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM