3

我目前正在运行一个托管静态 HTML 文件的 G-WAN 服务器。现在我正在使用 iframe 来显示这些文件的内容。我希望能够使用 JavaScript 跨域加载它们。默认情况下,浏览器不允许这样做。

一个简单的解决方法是将标头:Access-Control-Allow-Origin: * 添加到 HTTP 响应中。问题是,我想避免制作一个 G-WAN servlet 来返回静态 HTML,只是为了添加标题。

是否可以默认添加标题?

4

2 回答 2

0

是否可以默认添加 [HTTP] 标头?

当然,在 G-WAN 连接处理程序中添加以下代码:

  case HDL_BEFORE_WRITE:
  {
     char head[] = "Access-Control-Allow-Origin: *\r\n\r\n";
     http_header(HEAD_ADD, head, sizeof(head) - 1, argv);
     break;
  }

这将适用于所有回复,静态和动态。

如果您想更有选择性,只需在上面的代码中添加您的过滤器。

于 2013-06-25T11:33:36.473 回答
0

我不得不奋斗几个小时才能找到完美解决问题的这几行代码,所以我在下面分享它们。首先,您必须在G-WAN 虚拟主机的handlers文件夹中创建一个main.c文件(如果该文件夹不存在或已禁用,请创建/重命名该文件夹)并复制/粘贴以下内容:

// Add simple CORS header (Access-Control-Allow-Origin: *) to all resources

#include "gwan.h"   // G-WAN exported functions

int init(int argc, char *argv[])
{
    u32 *states = (u32*)get_env(argv, US_HANDLER_STATES);
    *states = (1 << HDL_BEFORE_WRITE);
    return 0;
}

void clean(int argc, char *argv[])
{
}

int main(int argc, char *argv[])
{
    char head[] = "Access-Control-Allow-Origin: *\r\n";
    http_header(HEAD_ADD, head, sizeof(head) - 1, argv);  
    return(255);
}

然后,杀死g-wan,以root身份运行以编译脚本,重新杀死并以您的Web用户身份运行它(请使用您的g-wan root更改/var/www路径,使用Web用户更改www-data-user您正在使用...另外,如果您没有以 root 身份登录,请使用 sudo):

/var/www/gwan -k
/var/www/gwan

(现在 CTRL-C 退出)

/var/www/gwan -k
/var/www/gwan -d:www-data:www-data-user

现在你所有的资源都会有一个漂亮的 Access-Control-Allow-Origin: * header :-)

于 2020-06-05T16:35:55.693 回答