【问题标题】:Can I add Access-Control-Allow-Origin: * to the default headers我可以将 Access-Control-Allow-Origin: * 添加到默认标头吗
【发布时间】:2013-06-24 11:25:43
【问题描述】:

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

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

是否可以默认添加header?

【问题讨论】:

    标签: ajax http-headers g-wan


    【解决方案1】:

    是否可以默认添加 [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;
      }
    

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

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

    【讨论】:

    • 非常感谢您的回复。我是否必须在 /handlers/ 目录中为我想要的主机名创建一个 main.c 文件?
    • 是的。查看示例,了解如何在 init() 中选择您希望接收的通知(此处为 HDL_BEFORE_WRITE)。上面的代码进入处理程序 main().
    • 小心:使用 "\r\n\r\n" 会使当前浏览器抱怨编码无效。正如 RFC 所述,标头必须以单个“\r\n”结尾。我因此浪费了几个小时:-)(如果有兴趣,请参阅下面我准备使用的 main.c)
    【解决方案2】:

    为了得到这几行完美解决问题的代码,我不得不奋斗几个小时,所以我在下面分享它们。 首先,您必须在您的 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 和 www-data-user 更改 /var/www 路径您正在使用的网络用户...另外,如果您没有以 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: * 标头 :-)

    【讨论】:

      猜你喜欢
      • 2012-09-19
      • 2011-06-27
      • 2016-07-03
      • 2016-01-11
      • 2013-01-07
      • 2019-07-13
      • 1970-01-01
      • 2016-09-05
      相关资源
      最近更新 更多