Solución:
los Server
línea me hizo pensar que tal vez los activos no están siendo manejados por Rails, sino por nginx
:
Esto significa que los encabezados deben ser agregados por nginx
, no Rails, por lo que debemos configurar nginx
. Resulta que la capacidad de configurar nginx
es posible a partir de Passenger 4.0.39 – (aquí está el correspondiente Git diff). La documentación correspondiente está disponible en Passenger Standalone, en Configuración avanzada.
Una nota importante en la documentación: El archivo de plantilla de configuración original puede cambiar de vez en cuando, por ejemplo, porque se introducen nuevas funciones en Phusion Passenger. Si su archivo de plantilla de configuración no contiene los cambios necesarios, es posible que estas nuevas funciones no funcionen correctamente. En el peor de los casos, Standalone podría incluso funcionar mal. Por lo tanto, cada vez que actualice Phusion Passenger, debe verificar si el archivo de la plantilla de configuración original ha cambiado y fusionar los cambios en su propio archivo.
Con respecto a esa nota, además de la copia personalizable del archivo de configuración, cree una copia “original” que pueda diff
siempre que actualice Passenger.
intento
cp $(passenger-config about resourcesdir)/templates/standalone/config.erb config/nginx.conf.erb
cp config/nginx.conf.erb config/nginx.conf.erb.original
A continuación, agregue --nginx-config-template config/nginx.conf.erb
al web
en linea Procfile
.
Procfile
web: bundle exec passenger start -p $PORT --max-pool-size 3 --nginx-config-template config/nginx.conf.erb
config / nginx.conf.erb
A continuación, edite el archivo de configuración config/nginx.conf.erb
encontrando un bloque que tenga el siguiente aspecto:
location @static_asset {
gzip_static on;
expires max;
add_header Cache-Control public;
add_header ETag "";
}
… y suma los dos Access-Control
líneas:
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 *;
}
Eso es todo. Esto funcionará en production
, pero no en development
, debido a config.assets
diferencias entre los dos.
la diferencia de configuración
los diff
No debería devolver nada ahora, pero si alguna actualización futura del pasajero incluye un cambio en este archivo, lo sabrá.
diff $(passenger-config about resourcesdir)/templates/standalone/config.erb config/nginx.conf.erb.original
documentación de nginx
- http://nginx.org/en/docs/beginners_guide.html
- http://nginx.org/en/docs/http/ngx_http_core_module.html#location
mejoras futuras
- restringir el
Allow-Origin
- restringir el
Request-Method
- restringir ambos encabezados a solo fuentes
No estoy seguro de que sea la respuesta, pero parece que también podrías probar la forma más fácil de usar after_filter
con:
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'
...
¡SÍ! Finalmente.
La respuesta de user664833 anterior es excelente, excepto que no pude encontrar mi archivo de configuración de Passenger para editar.
La respuesta de Thomas Nye aquí proporciona el archivo completo para crear en config / nginx.conf.erb:
##########################################################################
# 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
debe incluir la línea:
web: bundle exec passenger start -p $PORT --max-pool-size 3 --nginx-config-template config/nginx.conf.erb
También deberá configurar su CDN Cloudfront que está sirviendo los activos según la respuesta de Guapolo
En su distribución que le está dando el dolor de CORS, vaya a la pestaña de comportamientos y un nuevo comportamiento, seleccionando la ruta al activo, es decir, /assets/icons.ttf y la lista blanca ‘Origen’ según la imagen de arriba.
Es posible que también necesite, en su distribución, ‘invalidar’ el antiguo recurso en caché, en la pestaña de invalidaciones, es decir, poner el activo completo y el nombre en caché de su inspector, e invalidarlo. Una vez que se haya procesado, implemente la aplicación con la configuración y reinicie heroku. Deberá abrir el inspector y “vaciar el caché y volver a cargar” la página.
Con suerte, eso funciona; parece que la configuración del pasajero cambia de vez en cuando, por lo que es posible que encontremos esto y la respuesta deba actualizarse para reflejar la nueva configuración.