Am nginx 1.14.0
rulează pe serverul Ubuntu 18.04. Pe acel server, încerc să găzduiesc multe aplicații diferite. Scopul meu este ca fiecare locație să existe într-un subdirector al adresei mele URL, server.calebjay.com.
De exemplu, chiar acum aș dori să mă instalez pigallery2 pentru a fi disponibil la server.calebjay.com/photos
. Pentru a face acest lucru, am o instanță docker care servește pe portul 800 și am nginx
proxy la acesta. Acest lucru funcționează parțial, în măsura în care index.html
încărcături.
Cu toate acestea, adrese URL relative, cum ar fi script src
, nu se rezolvă, cred pentru că sunt formate ca main.js
în loc de /photos/main.js
.
Pentru a testa, pot OBȚINE
https://server.calebjay.com/photos, și rezolvați an index.html
. Primesc 404s pentru o mulțime de fișiere .js și .css. Confirm, dacă iau acele URL-uri relative și o fac https://server.calebjay.com/photos/main-asdfasdf.js
, mai primesc un 404, {adresa-ip-server}/photos/main-asdf.js
și https://server.calebjay.com/photos/main-asdf.js
ambele returnează corect fișierul JS dat.
Există multe răspunsuri în acest sens, însă niciunul nu a funcționat pentru mine.
Configurația mea de bază nginx:
/etc/nginx/nginx.conf
utilizator www-date;
worker_proceses auto;
pid /run/nginx.pid;
includ /etc/nginx/modules-enabled/*.conf;
evenimente {
conexiuni_muncitor 768;
}
http {
sendfile activat;
tcp_nopush activat;
tcp_nodelay activat;
keepalive_timeout 65;
types_hash_max_size 2048;
includ /etc/nginx/mime.types;
aplicație de tip_default/octet-stream;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Eliminarea SSLv3, ref: POODLE
ssl_prefer_server_ciphers activat;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
gzip on;
includ /etc/nginx/conf.d/*.conf;
includ /etc/nginx/sites-enabled/*;
}
Pentru subdomeniul și serverul docker unic la care mă adresez deocamdată:
/etc/nginx/sites-available/server.calebjay.com.conf
Server {
asculta 80 default_server;
asculta [::]:80 default_server;
nume_server server.calebjay.com www.server.calebjay.com;
returnează 301 https://$server_name$request_uri;
}
Server {
nume_server server.calebjay.com;
gzip on;
#locație ~ \.css {
# add_header Content-Type text/css;
#}
#locație ~ \.js {
# add_header Content-Type application/x-javascript;
#}
#Locație / {
# dacă ($http_referer ~ "^https?://[^/]+/fotografii/") {
# rescrie ^/(.*) https://$http_host/photos/$1 redirecționare;
# }
# dacă ($http_referer = "https://server.calebjay.com/photos/") {
# rescrie ^/(.*) https://server.calebjay.com/photos/$1 redirecționare;
# }
#}
locație /fotografii/ {
# rescrie ^/fotografii(/.*)$ $1 pauză;
proxy_pass http://localhost:800/;
proxy_http_versiunea 1.1;
proxy_set_header Actualizare $http_upgrade;
proxy_set_header Conexiune „upgrade”;
# sub_filter "<head>" "<head><base href=\"${scheme}://${host}/photos\">";
proxy_set_header Gazdă $gazdă;
proxy_cache_bypass $http_upgrade;
}
asculta 443 ssl default_server;
asculta [::]:443 ssl default_server;
ssl_certificate /etc/letsencrypt/live/server.calebjay.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/server.calebjay.com/privkey.pem;
includ /etc/letsencrypt/options-ssl-nginx.conf;
}
Fiecare dintre porțiunile comentate sunt experimente separate pe care le-am încercat din diferite locuri din rețeaua stivei:
Nici rescrie
bazat pe http-referitor
a funcționat, deși o imagine s-a rezolvat ca rezultat.
Având o regulă explicită pentru imagini nici adăugarea unui antet de tip mime a lucrat.
Răspunsuri privind conținutul static și try_files nu a funcționat și nici nu ar trebui să cred, deoarece fac proxy către un server.
Înlocuirea linkurilor folosind sub_filter nu a funcționat.
Setare Locație
la fel de /fotografii
în loc de /fotografii/
nu a funcționat.
Nu am acces la elementele interne ale docker, așa că nu pot modifica direct html-ul.
Cum pot să-mi iau hrefs
pentru a rezolva împotriva domeniului corespunzător, cu subdirectorul de /fotografii/
?
(Am repornit nginx după fiecare schimbare de configurare)
Mai multe detalii:
nginx -V
Versiunea nginx: nginx/1.14.0 (Ubuntu)
construit cu OpenSSL 1.1.1 11 septembrie 2018
Suportul TLS SNI activat
configurați argumente: --with-cc-opt='-g -O2 -fdebug-prefix-map=/build/nginx-H4cN7P/nginx-1.14.0=.-fstack-protector-strong -Wformat -Werror=format-security -fPIC -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl ,-z,now -fPIC' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path= /usr/lib/nginx/modules --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http- proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-http_with-module -threads --with-http_addition_module --with-http_geoip_module=dynamic --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_fi lter_module=dynamic --with-http_sub_module --with-http_xslt_module=dynamic --with-stream=dynamic --with-stream_ssl_module --with-mail=dynamic --with-mail_ssl_module
EDIT: Ah, se pare că http_referer
rescrie
soluția funcționează în încărcarea js, css etc, dar apoi aplicația JS modifică adresa URL a clientului pe partea clientului, fără a emite o solicitare, pentru a server.calebjay.com/
, determinând astfel afișarea browserului meu server.calebjay.com/login
, provocând astfel pierderea cererilor viitoare http_referer
. Poate fi imposibil să remediez acest lucru, deoarece nu cunosc vreo modalitate de a forța javascript să rescrie adresele URL pe baza unui subdirector. Pot fi forțat să am pur și simplu toate aplicațiile mele pe subdomenii separate, cu excepția cazului în care aplicația dată ia o configurație de subdirector.