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

时间:2011-09-11 01:27:17

标签: apache webserver basic-authentication apache-config http-basic-authentication

我想使用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标头?

1 个答案:

答案 0 :(得分:4)

答案是:

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

而不是

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

原因在于documentation of Header directive

  

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

     

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

     

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

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

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