首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何使用rails、nginx和客运配置“`Access Control-”?

如何使用rails、nginx和客运配置“`Access Control-”?
EN

Stack Overflow用户
提问于 2014-09-19 21:01:13
回答 5查看 14.5K关注 0票数 17

我不能让Access-Control-Allow-Origin在Chrome中出现--我的最终目标是用Rails为字体配置CORS,所以它在production中与CloudFront一起工作。不过,就目前而言,我只想让它在development中工作。我可以通过curl看到标题,但看不到Chrome。

我正在使用Rails 4.0,我已经尝试了以下所有.

我已经按照Gemfileapplication.rb配置了rails 4的机架-cors示例

Gemfile

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gem 'rack-cors', '~> 0.2.9', require: 'rack/cors'

config/application.rb

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
config.middleware.insert_before 'ActionDispatch::Static', 'Rack::Cors' do
    allow do
        origins '*'
        resource '*',
            :headers => :any,
            :methods => [:get, :options, :head]
    end
end

rails控制台

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2.0.0-p481 :001 > Rails.env
 => "development"
2.0.0-p481 :002 > Hello::Application.config.serve_static_assets
 => true

bash

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
curl -i http://localhost:5000/assets/OpenSans-Regular-webfont.woff

Content-Type: application/font-woff
Content-Length: 22660
Connection: keep-alive
Status: 200 OK
Cache-Control: public, must-revalidate
Last-Modified: Wed, 30 Apr 2014 23:51:57 GMT
ETag: "467b34801137bd4031e139839ad86370"
X-Request-Id: c4b07b4d-1c43-44ea-9565-dfda66378f98
X-Runtime: 0.046007
X-Powered-By: Phusion Passenger 4.0.50
Date: Sat, 20 Sep 2014 04:39:38 UTC
Server: nginx/1.6.1 + Phusion Passenger 4.0.50

curl -i -H "Origin: http://localhost:5000" http://localhost:5000/assets/OpenSans-Regular-webfont.woff

Content-Type: application/font-woff
Content-Length: 22660
Connection: keep-alive
Status: 200 OK
Cache-Control: public, must-revalidate
Last-Modified: Wed, 30 Apr 2014 23:51:57 GMT
ETag: "467b34801137bd4031e139839ad86370"
Access-Control-Allow-Origin: http://localhost:5000   # adding
Access-Control-Allow-Methods: GET, OPTIONS, HEAD     # -H
Access-Control-Max-Age: 1728000                      # produced
Access-Control-Allow-Credentials: true               # these
Vary: Origin                                         # headers
X-Request-Id: b9666f30-416d-4b5b-946a-bdd432bc191c
X-Runtime: 0.050420
X-Powered-By: Phusion Passenger 4.0.50
Date: Sat, 20 Sep 2014 03:45:30 UTC
Server: nginx/1.6.1 + Phusion Passenger 4.0.50

Chrome (v37)开发工具>网络>OpenSans-正则-webfont.woff>头>响应头

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
HTTP/1.1 304 Not Modified
Connection: keep-alive
Status: 304 Not Modified
Cache-Control: no-cache
X-Request-Id: ac153b8c-e0cb-489d-94dd-90aacc10d715
X-Runtime: 0.116511
X-Powered-By: Phusion Passenger 4.0.50
Date: Sat, 20 Sep 2014 03:41:53 UTC
Server: nginx/1.6.1 + Phusion Passenger 4.0.50

我还尝试了以下替代方案,如各种来源所示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
config.middleware.insert_before 'ActionDispatch::Static', 'Rack::Cors' do
config.middleware.insert_after Rails::Rack::Logger, Rack::Cors do
config.middleware.insert_before Warden::Manager, Rack::Cors do
config.middleware.insert 0, Rack::Cors do
config.middleware.use Rack::Cors do

我还尝试了以下applications.rb,如如何使用Rails和CloudFront在火狐中显示CloudFront所示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
config.assets.header_rules = {
  :global => {'Cache-Control' => 'public, max-age=31536000'},
  :fonts  => {'Access-Control-Allow-Origin' => '*'}
}

我还在config.ru中尝试了以下内容,如Heroku上带有Rails的CloudFront CDN所示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
require 'rack/cors'
use Rack::Cors do
    allow do
        origins '*'
        resource '*', :headers => :any, :methods => :get 
    end 
end

包exec rake中间件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
use Rack::Cors
use Rack::Sendfile
use ActionDispatch::Static
use Rack::Lock
use #<ActiveSupport::Cache::Strategy::LocalCache::Middleware:0x007f9ec21590b0>
use Rack::Runtime
use Rack::MethodOverride
use ActionDispatch::RequestId
use Rails::Rack::Logger
use ActionDispatch::ShowExceptions
use ActionDispatch::DebugExceptions
use ActionDispatch::RemoteIp
use ActionDispatch::Reloader
use ActionDispatch::Callbacks
use ActiveRecord::Migration::CheckPending
use ActiveRecord::ConnectionAdapters::ConnectionManagement
use ActiveRecord::QueryCache
use ActionDispatch::Cookies
use ActionDispatch::Session::CookieStore
use ActionDispatch::Flash
use ActionDispatch::ParamsParser
use Rack::Head
use Rack::ConditionalGet
use Rack::ETag
use Warden::Manager
use OmniAuth::Strategies::Facebook
run Hello::Application.routes

我也尝试过资产,但没有结果。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-09-22 07:02:34

Server行让我认为资产可能不是由Rails处理的,而是由nginx处理的。

这意味着头必须由nginx而不是Rails添加,因此我们需要配置nginx。原来可能在乘客4.0.39的情况下 - (下面是对应的Git diff)。相应的文档可以在高级配置下的独立乘客中获得。

文档中的一个重要注意事项:原始配置模板文件可能会不时更改,例如,因为Phusion乘客中引入了新的功能。如果配置模板文件不包含所需的更改,则这些新功能可能无法正常工作。在最坏的情况下,独立甚至可能出现故障。因此,每次升级Phusion乘客时,都应该检查原始配置模板文件是否已更改,并将任何更改合并回您自己的文件中。

关于该注意事项,除了配置文件的可定制副本之外,创建一个“原始”副本,无论何时升级乘客,您都可以使用该副本进行diff

bash

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cp $(passenger-config about resourcesdir)/templates/standalone/config.erb config/nginx.conf.erb
cp config/nginx.conf.erb config/nginx.conf.erb.original

接下来,将--nginx-config-template config/nginx.conf.erb添加到Procfile中的web行。

Procfile

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
web: bundle exec passenger start -p $PORT --max-pool-size 3 --nginx-config-template config/nginx.conf.erb

config/nginx.conf.erb

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    location @static_asset {
        gzip_static on;
        expires max;
        add_header Cache-Control public;
        add_header ETag "";
    }

...and添加了两行Access-Control

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    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 *;
    }

就是这样。这将在production中工作,但在development中不起作用,这是因为两者之间的config.assets差异。

配置diff

diff现在不应该返回任何内容,但是如果将来对乘客的任何更新包括对该文件的更改,您就会知道。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
diff $(passenger-config about resourcesdir)/templates/standalone/config.erb config/nginx.conf.erb.original

nginx文档

未来改进

  • 限制Allow-Origin
  • 限制Request-Method
  • 将两个标头限制在仅字体上
票数 17
EN

Stack Overflow用户

发布于 2016-12-07 09:24:50

是!终于来了。

User664833的以上回答很棒,只是我找不到我的用户配置文件来编辑。

Thomas的答案这里给出了在config/nginx.conf.Nye上创建的完整文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    ##########################################################################
#  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) %>
}

Procfile应包括以下一行:

web: bundle exec passenger start -p $PORT --max-pool-size 3 --nginx-config-template config/nginx.conf.erb

您还需要配置Cloudfront CDN,该CDN按照Guapolo的回答为资产提供服务

在您的发行版中,请转到“行为”选项卡和一个新的“行为”选项卡,根据上面的图像选择到资产的路径,即/ asset /icons.ttf和白名单“原产地”。

您还可能需要在分发版中“使”旧缓存的资源“失效”,即从检查器中输入完整的资产和缓存的名称,并使其失效。一旦处理完毕,使用配置部署应用程序并重新启动heroku。您需要打开检查器和“空缓存和硬重新加载”页面。

希望这是可行的-这听起来像乘客配置不时变化,所以我们可能会发现这个中断,答案将需要更新,以反映新的配置。

票数 3
EN

Stack Overflow用户

发布于 2014-09-19 22:47:05

我不确定它是否是答案,但看起来您也可以尝试使用after_filter的最简单方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
headers['Access-Control-Allow-Origin'] = '*'
headers['Access-Control-Allow-Methods'] = 'POST, PUT, DELETE, GET, OPTIONS'
headers['Access-Control-Request-Method'] = '*'
headers['Access-Control-Allow-Headers'] = 'Origin, X-Requested-With, Content-Type, Accept, Authorization'
...
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25945419

复制
相关文章
MySQL 特殊字符
SQL 注释是用来在 SQL 语句中添加对代码的解释说明。SQL 支持两种类型的注释符号。
恋喵大鲤鱼
2023/10/12
1K0
BashShell常量和特殊字符
其中,base 是一个 2 到 64 的十进制数值,表示数字的基数;n 是在 base 基数中的数字的值。如果忽略 base# ,则默认以 10 为基数。n 中的每一位数如果大于 9,则依次以小写字母、大写字母、@、_ 表示(最大表示到十进制中的 63,因为 base 最大为 64)。
hotarugali
2022/02/28
5.6K0
LaTeX特殊字符和符号
无论什么字体,LaTeX以一个反勾号或重音符(`)当做左引号,以一个正勾号或直立引号(')当做右引号。
hotarugali
2022/03/17
6.2K0
LaTeX特殊字符和符号
Mysql去除字符串中的特殊字符及varchar转int
Mysql中有varchar类型字段,并且为:123,456 形式,需要对其进行排序,并根据条件筛选出前5条
itze
2022/10/31
3.6K0
Shell特殊字符
shell既是类Unix操作系统的命令解析器,用于解释执行用户输入的一连串命令,它类似于DOS下的command和后来Windows的cmd.exe。同时shell也是一种程序设计语言。作为命令解释型的脚本语言,它交互式解释和执行用户输入的命令或者自动地解释和执行预先设定好的一连串的命令;作为程序设计语言,它预定义了各种环境变量,保留了一些关键字以及一些特殊字符的含义,并提供了许多在高级语言中才具有的控制结构,包括循环和分支判断。
恋喵大鲤鱼
2018/08/03
5.2K0
HTML特殊字符
HTML 原始码 显示结果 描述 &lt; < 小於号或显示标记 &gt; > 大於号或显示标记 &amp; & 可用於显示其它特殊字符 &quot; " 引号 &reg; ® 己注册 &copy; © 版权 &trade; ™ 商标 &ensp; 半方大的空白 &emsp; 全方大的空白 &nbsp; 不断行的空白
小小许
2018/09/20
3.7K0
常用的HTML和CSS(content)特殊字符图标
​之前折腾WordPress主题的时候感觉Font Awesome太过庞大,好多图标字体基本都用不上,加载起来太慢了,于是自己折腾了一套简单的图标字体,但在完善主题过程中才发现字体太少不够用(有些图标当时没想到),重新折腾又要重新来一次太麻烦。于是想到可以用css的content,通过伪元素将一些符合的unicode字符集插入其中。
楚客追梦
2022/10/30
3.6K0
Shell常用的特殊字符
点号在不同场景有着不同的含义,在目录路径中,一个点代表当前工作目录,两个点代表父目录;当一个文件以点号开头,表示一个隐藏文件;在正则表达式,点号代表匹配单个字符;
用户1679793
2020/10/29
8.1K0
常用的HTML和CSS(content)特殊字符图标
之前折腾主题的时候感觉Font Awesome太过庞大,好多图标字体基本都用不上,加载起来太慢了,于是自己折腾了一套简单的图标字体,但在完善主题过程中才发现字体太少不够用(有些图标当时没想到),重新折腾又要重新来一次太麻烦。于是想到可以用css的content,通过伪元素将一些符合的unicode字符集插入其中。
楚客追梦
2022/11/11
4.6K0
JXL读写Excel
使用JXL生成Excel文 package test.jxl; import jxl.Workbook; import jxl.write.Label; import jxl.write.WritableSheet; import jxl.write.WritableWorkbook; import jxl.write.WriteException; import org.apache.commons.lang3.RandomStringUtils; import java.io.File; impor
前Thoughtworks-杨焱
2021/12/08
2800
Makefile中特殊字符和关键字
.Phony 是一个特殊的工作目标,它后面的并不是一个实际文件名:只是在显式请求时执行命令的名字;而且肯定要视为未更新。使用 .Phony 的原因在于:
hotarugali
2022/03/11
8380
AJAX传递特殊字符的方法
AJAX传递特殊字符的方法 采用Ajax传递参数加号(+)和与符号(&)时候,服务端获取到的参数并不如意! (1) "+"号:JavaScript解析为字符串连接符,所以服务器端接收数据时"+"会丢失。 (2)"&":JavaScript解析为变量连接符,所以服务器端接收数据时&符号以后的数据都会丢失。 解决办法:在传到服务端之前先将参数中的"+"和"&"符号都编码一下 function filter(str) { str = str.replace(/\+/g,"%2B"); str =
wangxl
2018/03/07
2.8K0
java 对于表情和特殊字符的转码解码处理
转码然后插入到DB当中 String encodestr=URLEncoder.encode("需要转码的内容", "utf-8") 将encodestr插入数据库中 解码然后显示到页面当中 String decodestr=URLDecoder.decode("需要解码的内容", "utf-8") 在页面展示decodestr
用户4191150
2021/08/12
3.8K1
插入"&"特殊字符的几种思考
一位铁杆朋友,今天问了个问题,写了一个Python程序,从文件读取数据,其中可能包含“&”这种特殊字符,为了让其能插入Oracle,需要做什么处理?
bisal
2020/04/02
2.3K0
mysql命令创建数据库库名特殊字符
在使用mysql命令进行数据库创建时,发现“-”等特殊字符无法使用,提示sql语句语法错误。
程序新视界
2022/05/06
2.8K0
特殊字符乱码问题
1、使用标签 建议用(标签可以控制转换特殊字符): <html:text property=“instruction” readonly=“true” styleClass=“mylongreadonly” size=“32”/> <input name=“instruction” type=“hidden” value=”<mycim2:write name=“object” property=“instruction” filter=“true”/>” > <input name=“instruction” type=“hidden” value=”<bean:write name=“object” property=“instruction” filter=“true”/>” >
全栈程序员站长
2022/06/27
2.7K0
iOS去除特殊字符
// 清除特殊字符 + (NSString *)cleanSpecialCharacters:(NSString *)text { NSString *strResult = nil; NSMutableString *originString = [text mutableCopy]; NSCharacterSet *cs = [NSCharacterSet characterSetWithCharactersInString:@"~!@#$%^&*()+={}':;',[]\\.
Raindew
2019/05/17
3.3K0
转义JavaScript特殊字符
大家可以举一反三,触类旁通,反正,双引号和单引号可以配合着使用,把我上面的案例看懂,你就能灵活的运用了。
IT工作者
2022/01/05
4.1K0
点击加载更多

相似问题

Rails 3 AJAX问题- UJS

10

jquery_ujs和rails的问题-ujs问题ajax页面

218

基本UJS AJAX Rails 3.0更新问题

22

Rails UJS ajax:完全不触发

13

Rails UJS与URL params问题

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文