Rails 乘客 Glyphicon CORS Cloudfront NGINX 问题

Posted

技术标签:

【中文标题】Rails 乘客 Glyphicon CORS Cloudfront NGINX 问题【英文标题】:Rails Passenger Glyphicon CORS Cloudfront NGINX Issue 【发布时间】:2016-06-04 15:18:22 【问题描述】:

所以我知道 *** 是由这些关于 CORS nginx、Cloudfront 和 Heroku 的问题造成的,但由于某种原因我无法让它工作。我一直在关注这个问题的答案:

How do I configure `Access-Control-Allow-Origin` with rails, nginx and passenger?

但是我似乎无法弄清楚自定义代码块的放置位置:

config/nginx.conf.erb

接下来,编辑配置文件 config/nginx.conf.erb,找到一个 如下所示的块:

location @static_asset 
    gzip_static on;
    expires max;
    add_header Cache-Control public;
    add_header ETag "";
 ...and add the two Access-Control lines:

>     location @static_asset 
>         gzip_static on;
>         expires max;
>         add_header Cache-Control public;
>         add_header ETag "";
>         add_header Access-Control-Allow-Origin *;
>         add_header Access-Control-Request-Method *;
>      That's it. This will work in production, but not in development, due to config.assets differences between the two.

在我的 Nginx 配置中。我正在使用 Phusion 乘客 5.0.23。 Nginx 配置在我从乘客那里提取的位置中没有 @static_asset 块。它确实有一个用于自定义配置的部分,但这对我不起作用。我的字形图标继续显示为框 我如何让它工作? 我也试过这个 Phusion Passenger + Heroku + Cloudfront: CORS Configuration

当前配置文件

    ##########################################################################
#  Passenger Standalone is built on the same technology that powers
#  Passenger for Nginx, so any configuration option supported by Passenger
#  for Nginx can be applied to Passenger Standalone as well. You can do
#  this by direct editing the Nginx configuration template that is used by
#  Passenger Standalone.
#
#  This file is the original template. DO NOT EDIT THIS FILE DIRECTLY.
#  Instead, make a copy of this file and pass the `--nginx-config-template`
#  parameter to Passenger Standalone.
#
#  Learn more about using the Nginx configuration template at:
#  https://www.phusionpassenger.com/library/config/standalone/intro.html#nginx-configuration-template
#
#  *** NOTE ***
#  If you customize the template file, make sure you keep an eye on the
#  original template file and merge any changes. New Phusion Passenger
#  features may require changes to the template file.
##############################################################

<%= include_passenger_internal_template('global.erb') %>

worker_processes 1;
events 
    worker_connections 1024;


http 
    <%= include_passenger_internal_template('http.erb', 4) %>



    ### BEGIN your own configuration options ###
    # This is a good place to put your own config
    # options. Note that your options must not
    # conflict with the ones Passenger already sets.
    # Learn more at:
    # https://www.phusionpassenger.com/library/config/standalone/intro.html#nginx-configuration-template

    ### END your own configuration options ###

    default_type application/octet-stream;
    types_hash_max_size 2048;
    server_names_hash_bucket_size 64;
    client_max_body_size 1024m;
    access_log off;
    keepalive_timeout 60;
    underscores_in_headers on;
    gzip on;
    gzip_comp_level 3;
    gzip_min_length 150;
    gzip_proxied any;
    gzip_types text/plain text/css text/json text/javascript
        application/javascript application/x-javascript application/json
        application/rss+xml application/vnd.ms-fontobject application/x-font-ttf
        application/xml font/opentype image/svg+xml text/xml;

    <% if @app_finder.multi_mode? %>
        # Default server entry for mass deployment mode.
        server 
            <%= include_passenger_internal_template('mass_deployment_default_server.erb', 12) %>
        
    <% end %>

    <% for app in @apps %>
    server 
        <%= include_passenger_internal_template('server.erb', 8, true, binding) %>
        <%= include_passenger_internal_template('rails_asset_pipeline.erb', 8, false) %>

        ### BEGIN your own configuration options ###
        # This is a good place to put your own config
        # options. Note that your options must not
        # conflict with the ones Passenger already sets.
        # Learn more at:
        # https://www.phusionpassenger.com/library/config/standalone/intro.html#nginx-configuration-template

        # CloudFront fix 
        location /public/* 
            gzip_static on;
            expires max;
            add_header Cache-Control public;
            add_header ETag "";
            add_header Access-Control-Allow-Origin *;
            add_header Access-Control-Request-Method *;
        


        ### END your own configuration options ###
    
    passenger_pre_start <%= listen_url(app) %>;
    <% end %>

【问题讨论】:

是否设置了@static_asset?有人知道这是什么原因吗? @portforwardpodcast 我已经硬编码了它,但它仍然无法正常工作。 【参考方案1】:

我遇到了同样的问题,这个配置对我有用:

    ##########################################################################
#  Passenger Standalone is built on the same technology that powers
#  Passenger for Nginx, so any configuration option supported by Passenger
#  for Nginx can be applied to Passenger Standalone as well. You can do
#  this by direct editing the Nginx configuration template that is used by
#  Passenger Standalone.
#
#  This file is the original template. DO NOT EDIT THIS FILE DIRECTLY.
#  Instead, make a copy of this file and pass the `--nginx-config-template`
#  parameter to Passenger Standalone.
#
#  Learn more about using the Nginx configuration template at:
#  https://www.phusionpassenger.com/library/config/standalone/intro.html#nginx-configuration-template
#
#  *** NOTE ***
#  If you customize the template file, make sure you keep an eye on the
#  original template file and merge any changes. New Phusion Passenger
#  features may require changes to the template file.
##############################################################

<%= include_passenger_internal_template('global.erb') %>

worker_processes 1;
events 
    worker_connections 4096;


http 
    <%= include_passenger_internal_template('http.erb', 4) %>

    ### BEGIN your own configuration options ###
    # This is a good place to put your own config
    # options. Note that your options must not
    # conflict with the ones Passenger already sets.
    # Learn more at:
    # https://www.phusionpassenger.com/library/config/standalone/intro.html#nginx-configuration-template

    ### END your own configuration options ###

    default_type application/octet-stream;
    types_hash_max_size 2048;
    server_names_hash_bucket_size 64;
    client_max_body_size 1024m;
    access_log off;
    keepalive_timeout 60;
    underscores_in_headers on;
    gzip on;
    gzip_comp_level 3;
    gzip_min_length 150;
    gzip_proxied any;
    gzip_types text/plain text/css text/json text/javascript
        application/javascript application/x-javascript application/json
        application/rss+xml application/vnd.ms-fontobject application/x-font-ttf
        application/xml font/opentype image/svg+xml text/xml;

    <% if @app_finder.multi_mode? %>
        # Default server entry for mass deployment mode.
        server 
            <%= include_passenger_internal_template('mass_deployment_default_server.erb', 12) %>
        
    <% end %>

    <% for app in @apps %>
    server 
        <%= include_passenger_internal_template('server.erb', 8, true, binding) %>
        <%# <%= include_passenger_internal_template('rails_asset_pipeline.erb', 8, false) %1> %>

        ### BEGIN your own configuration options ###
        # This is a good place to put your own config
        # options. Note that your options must not
        # conflict with the ones Passenger already sets.
        # Learn more at:
        # https://www.phusionpassenger.com/library/config/standalone/intro.html#nginx-configuration-template
        # Rails asset pipeline support.
        location ~ "^/assets/.+-([0-9a-f]32|[0-9a-f]64)\..+" 
            error_page 490 = @static_asset;
            error_page 491 = @dynamic_request;
            recursive_error_pages on;

            if (-f $request_filename) 
                return 490;
            
            if (!-f $request_filename) 
                return 491;
            
        
        location @static_asset 
            gzip_static on;
            expires max;
            add_header Cache-Control public;
            add_header ETag "";
            if ($http_origin ~* ((https?:\/\/[^\/]*\.herokuapp\.com(:[0-9]+)?))) 
                add_header 'Access-Control-Allow-Origin' "$http_origin";
                add_header 'Access-Control-Allow-Credentials' 'true';
                add_header 'Access-Control-Allow-Methods' 'GET, HEAD';
                add_header 'Access-Control-Allow-Headers' 'Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Mx-ReqToken,X-Requested-With';
            
        
        location @dynamic_request 
            passenger_enabled on;
        

        ### END your own configuration options ###
    
    passenger_pre_start <%= listen_url(app) %>;
    <% end %>

    <%= include_passenger_internal_template('footer.erb', 4) %>

【讨论】:

以上是关于Rails 乘客 Glyphicon CORS Cloudfront NGINX 问题的主要内容,如果未能解决你的问题,请参考以下文章

Apache2 的 Rails 乘客问题

Rails + Elastic Beanstalk + Passenger:更改乘客配置

Rails生产方式的乘客

Rails 3:乘客找不到捆绑程序安装的 git gem

乘客中的重复事件,在 websocket-rails 中

nginx + 乘客 + rails - 403 禁止错误