Rails 2 i Ngnix: strony https nie mogą załadować css lub js (ale załadują grafikę)

0

WSTĘP: zamieściłem to samo pytanie na stackoverflow, zanim zdałem sobie sprawę, że prawdopodobnie lepiej nadaje się dla superużytkownika, ale to zależy od odpowiedzi: Jeśli okaże się, że jest to problem w mojej konfiguracji nginx, to zdecydowanie superużytkownik. Jeśli okaże się, że jest to problem w mojej konfiguracji (lub kodzie) Railsów, to prawdopodobnie jest to przepełnienie stosu.

Dodam kilka stron https do mojej witryny z szynami. Aby przetestować to lokalnie, prowadzę moją witrynę pod jedną instancją mongrel_rails (na 3000) i nginx.

Udało mi się doprowadzić moją konfigurację nginx do punktu, w którym mogę faktycznie przejść do stron https, a one się ładują. Poza tym wszystkie pliki javascript i css nie ładują się: patrząc na kartę Sieć w narzędziach Chrome, widzę, że próbuje załadować je za pośrednictwem adresu URL https. Np. Jednym z niedziałających adresów URL plików jest

https://cmw-local.co.uk/stylesheets/cmw-logged-out.css?1383759216

Mam je skonfigurowane (a przynajmniej tak mi się wydaje) w mojej konfiguracji nginx, aby przekierowywać do wersji http plików statycznych. Wydaje się, że działa to w przypadku grafiki, ale nie w przypadku plików css i js.

Jeśli kliknę na to w zakładce Sieć, przeniesie mnie do powyższego adresu URL, który przekierowuje do wersji http. Przekierowanie wydaje się więc działać w pewnym sensie, ale nie wtedy, gdy są ładowane przez stronę https. Tak jak mówię, myślałem, że omówiłem to w drugiej dyrektywie try_files w poniższej konfiguracji, ale może nie.

Czy ktoś może zobaczyć, co robię źle? dzięki, Max

Oto moja konfiguracja nginx - przepraszam, że jest trochę długa! Myślę, że błąd prawdopodobnie występuje w pierwszym bloku serwera (ssl):

UWAGA: adresy URL w tym miejscu (elearning.dev, cmw-dev.co.uk itp.) Są tylko lokalnymi nazwami hostów, tzn. Są tylko aliasami dla 127.0.0.1

server {
  listen 443 ssl;
  keepalive_timeout   70;

  ssl_certificate /home/max/work/charanga/elearn_container/elearn/config/nginx/certs/max-local-server.crt;
  ssl_certificate_key /home/max/work/charanga/elearn_container/elearn/config/nginx/certs/max-local-server.key;

  ssl_session_cache shared:SSL:10m;
  ssl_session_timeout 10m;
  ssl_protocols SSLv3 TLSv1;
  ssl_ciphers RC4:HIGH:!aNULL:!MD5;
  ssl_prefer_server_ciphers on;

  server_name elearning.dev cmw-dev.co.uk cmw-dev.com cmw-nginx.co.uk cmw-local.co.uk;

  root /home/max/work/charanga/elearn_container/elearn;

  # ensure that we serve css, js, other statics when requested
  # as SSL, but if the files don't exist (i.e. any non /basket controller)
  # then redirect to the non-https version
  location / {
    try_files $uri @non-ssl-redirect;
  }

  # securely serve everything under /basket (/basket/checkout etc)
  # we need general too, because of the email/username checking
  location ~ ^/(basket|general|cmw/account/check_username_availability) {
    # make sure cached copies are revalidated once they're stale
    add_header Cache-Control  "public, must-revalidate, proxy-revalidate";

    # this serves Rails static files that exist without running
    # other rewrite tests
    try_files $uri @rails-ssl;
    expires 1h;
  }

  location @non-ssl-redirect {
    return 301 http://$host$request_uri;
  }

  location @rails-ssl {

    proxy_set_header  X-Real-IP  $remote_addr;
    proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;

    proxy_read_timeout 180; 

    proxy_next_upstream off;
    proxy_pass http://127.0.0.1:3000;
    expires 0d;
  }

}

#upstream elrs {
#  server 127.0.0.1:3000;
#}

server {
  listen       80;
  server_name elearning.dev cmw-dev.co.uk cmw-dev.com cmw-nginx.co.uk cmw-local.co.uk;

  root /home/max/work/charanga/elearn_container/elearn;

  access_log /home/max/work/charanga/elearn_container/elearn/log/access.log;
  error_log  /home/max/work/charanga/elearn_container/elearn/log/error.log debug;
  client_max_body_size  50M;
  index index.html index.htm;

  # gzip html, css & javascript, but don't gzip javascript for pre-SP2 MSIE6 (i.e. those *without* SV1 in their user-agent string)
  gzip  on;   
  gzip_http_version 1.1;
  gzip_vary on;
  gzip_comp_level 6;
  gzip_proxied any;
  gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; #text/html 

  # make sure gzip does not lose large gzipped js or css files
  # see http://blog.leetsoft.com/2007/7/25/nginx-gzip-ssl
  gzip_buffers 16 8k;

  # Disable gzip for certain browsers.
  #gzip_disable "MSIE [1-6].(?!.*SV1)";
  gzip_disable "MSIE [1-6]";

  # blank gif like it's 1995
  location = /images/blank.gif {
    empty_gif;
  }

  # don't serve files beginning with dots
  location ~ /\. { access_log off; log_not_found off; deny all; }

  # we don't care if these are missing
  location = /robots.txt   { log_not_found off; }
  location = /favicon.ico   { log_not_found off; } 
  location ~ affiliate.xml { log_not_found off; }  
  location ~ copyright.xml { log_not_found off; }  

  # convert urls with multiple slashes to a single /
  if ($request ~ /+ ) {
    rewrite ^(/)+(.*) /$2 break;
  }

  # X-Accel-Redirect
  # Don't tie up mongrels with serving the lesson zips or exes, let Nginx do it instead
  location /zips {
   internal;
   root /var/www/apps/e_learning_resource/shared/assets;
  }

  location /tmp {
   internal;
   root /;
  }

  location /mnt{
   root /;
  }

  # resource library thumbnails should be served as usual
  location ~ ^/resource_library/.*/*thumbnail.jpg$ {
    if (!-f $request_filename) {
      rewrite ^(.*)$ /images/no-thumb.png
      break;
    }
    expires 1m;
  } 

    # don't make Rails generate the dynamic routes to the dcr and swf, we'll do it here
    location ~ "lesson viewer.dcr" {
      rewrite ^(.*)$ "/assets/players/lesson viewer.dcr" break;
    }

    # we need this rule so we don't serve the older lessonviewer when the rule below is matched
    location = /assets/players/virgin_lesson_viewer/_cha5513/lessonViewer.swf {
      rewrite ^(.*)$ /assets/players/virgin_lesson_viewer/_cha5513/lessonViewer.swf break;
    }

    location ~ v6lessonViewer.swf {
      rewrite ^(.*)$ /assets/players/v6lessonViewer.swf break;
    }

    location ~ lessonViewer.swf {
      rewrite ^(.*)$ /assets/players/lessonViewer.swf break;
    }

    location ~ lgn111.dat {
      empty_gif;
    } 

  # try to get autocomplete school names from memcache first, then
  # fallback to rails when we can't
  location /schools/autocomplete { 
    set $memcached_key $uri?q=$arg_q;
    memcached_pass     127.0.0.1:11211;
    default_type       text/html;

    error_page         404 =200 @rails; # 404 not really! Hand off to rails
  }  

  location / {

    # make sure cached copies are revalidated once they're stale
    add_header Cache-Control  "public, must-revalidate, proxy-revalidate";

    # this serves Rails static files that exist without running other rewrite tests
    try_files $uri @rails;

    expires 1h;
  }

  location @rails {

    proxy_set_header  X-Real-IP  $remote_addr;
    proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;

    proxy_read_timeout 180; 

    proxy_next_upstream off;
    proxy_pass http://127.0.0.1:3000;
    expires 0d;
  }
}
Max Williams
źródło
Czy to nie jest problem, że Twoja przeglądarka nie chce ładować niezabezpieczonych treści na bezpiecznej stronie? Czy wszystko działa, jeśli nie przekierowujesz CSS i JS? Czy naprawdę nie stać Cię na koszty zasobów związane z transportem CSS i JS przez HTTPS?
deed02392,
@ deed02392 - tak, chyba to jest problem. Nie mam problemu z kosztem zasobów, mam problem, że nie wiem, jak to zrobić :)
Max Williams,
Cóż, tak naprawdę nie możesz sprawić, by to zadziałało, ponieważ to Twoi klienci decydują, czy chcą zaakceptować niezabezpieczone zasoby w innym zabezpieczonym połączeniu (HTML przez HTTPS). Myślę, że twoja odpowiedź musi być - nie rób tego. Zaoferuj te zasoby przez HTTPS, a Twój problem zniknie.
deed02392,
@ deed02392 - myślę, że źle to sformułowałem. Ja osobiście NIE Troszczy się o to, czy arkusze stylów przechodzą przez https, czy nie. Chodzi mi o to, aby ładowały się bez wywoływania ostrzeżeń, bez względu na to, czy jesteś na stronie http, czy https, bez wchodzenia do aplikacji i zmieniania wszystkich łączy arkuszy stylów, aby były zależne od protokołu lub coś w tym rodzaju. Myślę, że można to osiągnąć poprzez konfigurację nginx. O to pytam.
Max Williams