我目前正在运行一个托管静态HTML文件的G-WAN服务器。现在,我正在使用iframe来显示这些文件的内容。我希望能够使用JavaScript跨域加载它们。默认情况下,浏览器不允许使用。
一个简单的解决方法是将标头:Access-Control-Allow-Origin:*添加到HTTP响应中。问题是,我想避免为返回静态HTML而创建G-WAN servlet,而只是添加标头。
默认情况下是否可以添加标题?
默认情况下是否可以添加[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;
}
这将适用于所有静态和动态答复。
如果要更具选择性,只需在上面的代码中添加过滤器。
我不得不花几个小时才能找到能完美解决问题的以下几行代码,因此在下面共享它们。首先,您必须在您的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根更改/ var / www路径,并使用www.data-user更改您正在使用的网络用户...也请使用sudo(如果您没有以root用户身份登录):
/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:*标头:-)