ฉันมี nginx 1.14.0
ทำงานบนเซิร์ฟเวอร์ Ubuntu 18.04 บนเซิร์ฟเวอร์นั้น ฉันพยายามโฮสต์แอปพลิเคชันต่างๆ ด้วยตนเอง เป้าหมายของฉันคือให้แต่ละตำแหน่งอยู่ในไดเร็กทอรีย่อยของ URL ของฉัน server.calebjay.com
ตัวอย่างเช่น ตอนนี้ผมต้องการตั้งค่า พิกแกลเลอรี2 ได้ที่ server.calebjay.com/photos
. ในการทำเช่นนั้น ฉันมีอินสแตนซ์นักเทียบท่าที่ให้บริการบนพอร์ต 800 และฉันมี จิงซ์
พร็อกซี่กับมัน สิ่งนี้ใช้ได้ผลเพียงบางส่วน index.html
โหลด
อย่างไรก็ตาม URL ที่เกี่ยวข้อง เช่น สคริปต์ src
, ไม่ได้แก้ไข, ผมเชื่อว่าเพราะพวกเขากำลังก่อตัวขึ้นเช่น main.js
แทน /photos/main.js
.
เพื่อทดสอบ ฉันทำได้ รับ
https://server.calebjay.com/photos, และแก้ปัญหา index.html
. ฉันได้รับ 404s สำหรับไฟล์ .js และ .css จำนวนมาก ยืนยัน ถ้าฉันคว้า URL สัมพัทธ์เหล่านั้น และทำ https://server.calebjay.com/photos/main-asdfasdf.js
ฉันยังคงได้รับ 404 {server-ip-address}/photos/main-asdf.js
และ https://server.calebjay.com/photos/main-asdf.js
ทั้งคู่ส่งคืนไฟล์ JS ที่กำหนดอย่างถูกต้อง
มีคำตอบมากมายเกี่ยวกับเรื่องนี้ แต่ไม่มีใครได้ผลสำหรับฉัน
การกำหนดค่า nginx พื้นฐานของฉัน:
/etc/nginx/nginx.conf
ผู้ใช้ www-data;
worker_processes อัตโนมัติ
pid /run/nginx.pid;
รวม /etc/nginx/modules-enabled/*.conf;
เหตุการณ์ {
worker_connections 768;
}
http {
ส่งไฟล์บน;
tcp_nopush บน;
tcp_nodelay บน;
keepalive_timeout 65;
types_hash_max_size 2048;
รวม /etc/nginx/mime.types;
แอปพลิเคชัน default_type/octet-stream;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # วาง SSLv3 อ้างอิง: พุดเดิ้ล
เปิด ssl_prefer_server_ciphers;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
เปิด gzip;
รวม /etc/nginx/conf.d/*.conf;
รวม /etc/nginx/sites-enabled/*;
}
สำหรับโดเมนย่อยและเซิร์ฟเวอร์นักเทียบท่าเดี่ยวที่ฉันใช้พร็อกซีในตอนนี้:
/etc/nginx/sites-available/server.calebjay.com.conf
เซิร์ฟเวอร์ {
ฟัง 80 default_server;
ฟัง [::]:80 default_server;
server_name server.calebjay.com www.server.calebjay.com;
ส่งคืน 301 https://$server_name$request_uri;
}
เซิร์ฟเวอร์ {
server_name server.calebjay.com;
เปิด gzip;
#ตำแหน่ง ~ \.css {
# add_header ข้อความประเภทเนื้อหา / css;
#}
#location ~ \.js {
# add_header แอปพลิเคชันประเภทเนื้อหา / x-javascript;
#}
#ที่ตั้ง / {
# ถ้า ($http_referer ~ "^https?://[^/]+/photos/") {
# เขียนใหม่ ^/(.*) https://$http_host/photos/$1 redirect;
# }
# ถ้า ($http_referer = "https://server.calebjay.com/photos/") {
# เขียนใหม่ ^/(.*) https://server.calebjay.com/photos/$1 redirect;
# }
#}
สถานที่ /รูปภาพ/ {
# เขียนใหม่ ^/photos(/.*)$ $1 พัก;
proxy_pass http://localhost:800/;
proxy_http_version 1.1;
proxy_set_header อัพเกรด $http_upgrade;
proxy_set_header การเชื่อมต่อ 'อัปเกรด';
# sub_filter "<head>" "<head><base href=\"${scheme}://${host}/photos\">";
proxy_set_header โฮสต์ $host;
proxy_cache_bypass $http_upgrade;
}
ฟัง 443 ssl default_server;
ฟัง [::]: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;
รวม /etc/letsencrypt/options-ssl-nginx.conf;
}
แต่ละส่วนที่แสดงความคิดเห็นเป็นการทดลองแยกต่างหากที่ฉันได้ลองจากที่ต่างๆ ในเครือข่ายสแต็ก:
ไม่ใช่ทั้งสองอย่าง เขียนใหม่
ขึ้นอยู่กับ http-ผู้อ้างอิง
ใช้งานได้แม้ว่าภาพหนึ่งภาพจะได้รับการแก้ไขก็ตาม
การมีกฎที่ชัดเจนสำหรับรูปภาพ ก็ไม่เช่นกัน การเพิ่มส่วนหัวประเภท mime ทำงาน
คำตอบเกี่ยวกับเนื้อหาคงที่ และ try_files ใช้งานไม่ได้ และฉันก็ไม่ควรเชื่อเช่นกัน เนื่องจากฉันใช้พร็อกซีไปยังเซิร์ฟเวอร์
แทนที่ลิงก์โดยใช้ sub_filter ไม่ได้ผล
การตั้งค่า ที่ตั้ง
เช่น /ภาพถ่าย
แทน /ภาพถ่าย/
ไม่ได้ผล
ฉันไม่สามารถเข้าถึง docker internals ได้ ดังนั้นจึงไม่สามารถแก้ไข html ได้โดยตรง
ฉันจะรับของฉันได้อย่างไร hrefs
เพื่อแก้ไขกับโดเมนที่ถูกต้องด้วยไดเร็กทอรีย่อยของ /ภาพถ่าย/
?
(ฉันรีสตาร์ท nginx หลังจากเปลี่ยนการกำหนดค่าทุกครั้ง)
รายละเอียดเพิ่มเติม:
nginx -V
รุ่น nginx: nginx/1.14.0 (Ubuntu)
สร้างด้วย OpenSSL 1.1.1 11 ก.ย. 2561
เปิดใช้งานการสนับสนุน TLS SNI
กำหนดค่าอาร์กิวเมนต์: --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,-B symbolic-functions -Wl,-z,relro -Wl ,-z, ตอนนี้ -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 --กับ-debug --กับ-pcre-jit --กับ-http_ssl_module --กับ-http_stub_status_module --กับ-http_realip_module --กับ-http_auth_request_module --กับ-http_v2_module --กับ-http_dav_module --กับ-http_slice_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
แก้ไข: อ่าดูเหมือนว่า http_referer
เขียนใหม่
โซลูชันทำงานในโหลด js, css ฯลฯ แต่แอปพลิเคชัน JS เปลี่ยน URL ไคลเอ็นต์ในฝั่งไคลเอ็นต์โดยไม่ต้องออกคำขอเป็น server.calebjay.com/
จึงทำให้เบราว์เซอร์ของฉันแสดง server.calebjay.com/login
จึงทำให้คำขอในอนาคตพลาดไป http_referer
. อาจไม่สามารถแก้ไขได้ เนื่องจากฉันไม่ทราบวิธีการบังคับจาวาสคริปต์ให้เขียน URL ใหม่ตามไดเร็กทอรีย่อย ฉันอาจถูกบังคับให้มีแอปพลิเคชันทั้งหมดของฉันในโดเมนย่อยแยกกัน เว้นแต่ว่าแอปพลิเคชันที่กำหนดจะใช้การกำหนดค่าไดเรกทอรีย่อย