ฉันกำลังพยายามแบ่งแอปพลิเคชั่น 3 ตัวออกจากที่เก็บหนึ่งแห่งเป็น 3 แต่ทำให้โครงสร้าง URL ดังนั้นโดยทั่วไปสถานที่ที่แตกต่างกันภายใต้โดเมนเดียวกันจะต้องถูกส่งโดยแอปพลิเคชันที่แตกต่างกัน
สิ่งที่ฉันกำลังดิ้นรนคือแอปหนึ่งต้องเป็นทางเลือกสำหรับ URL ที่ไม่มีอยู่จริงดังนั้นหากแอปแรกไม่ตรงกันและแอปที่สองไม่มีอยู่แอปที่สามควรจัดการคำขอ
โครงสร้างที่ฉันมีคือ:
/ etc / nginx / sites-enabled / main_site, ที่นี่, นอกเหนือจาก server_name และบันทึกที่ฉันได้รับinclude /etc/nginx/subsites-enabled/*
, ที่ฉันมีไฟล์กำหนดค่า 3 ไฟล์, หนึ่งไฟล์สำหรับแต่ละแอป
ไฟล์กำหนดค่า 3 ไฟล์แต่ละไฟล์มีบล็อกที่ตั้ง
ฉันได้ลองใช้ lookahead เชิงลบใน regex (โดยทั่วไปแล้วพยายามที่จะ hardcode URL ที่แอพอื่น ๆ จัดการ) แต่ล้มเหลว
ดังนั้นเพื่อสรุป:
/ และ / ชุมชนควรได้รับการจัดส่งโดย /etc/nginx/subsites-enabled/example.org/home (สคริปต์ Perl ไม่กี่ตัว)
/ ข่าวควรส่งโดย /etc/nginx/subsites-enabled/example.org/news (wordpress)
ทุกอย่างอื่นควรส่งโดย /etc/nginx/subsites-enabled/example.org/app (แอพเค้ก)
perl bit ทำงานได้ดี ปัญหาที่ฉันมีคือแอปกำลังรับช่วงต่อข่าวสาร (อาจเป็นเพราะมันตรงกับ *) ฉันได้ลองตัวเลือกที่หลากหลาย (ฉันเคยไปที่นี่มา 2 วันแล้ว) แต่ก็ไม่มีใครแก้ปัญหาทั้งหมดได้ (บางครั้ง สินทรัพย์คงไม่ทำงาน ฯลฯ )
การกำหนดค่าของฉันคือ:
/etc/nginx/sites-enabled/example.org:
server {
listen 80;
server_name example.org;
error_log /var/log/nginx/example.org.log;
include /etc/nginx/subsites-enabled/example.org/*;
}
/etc/nginx/subsites-enabled/example.org/home:
location = / {
rewrite ^.*$ /index.pl last;
}
location ~* /community(.*) {
rewrite ^.*$ /index.pl last;
}
location ~ \.pl {
root /var/www/vhosts/home;
access_log /var/log/nginx/home/access.log;
error_log /var/log/nginx/home/error.log;
include /etc/nginx/fastcgi_params;
fastcgi_index index.pl;
fastcgi_param SCRIPT_FILENAME /var/www/vhosts/home$fastcgi_script_name;
fastcgi_pass unix:/var/run/fcgiwrap.socket;
}
/ etc / ngins / ไซต์ย่อยที่เปิดใช้งาน / ข่าว
location /news {
access_log /var/log/nginx/news/access.log;
error_log /var/log/nginx/news/error.log debug;
error_page 404 = /news/index.php;
root /var/www/vhosts/news;
index index.php;
if (!-e $request_filename) {
rewrite ^.*$ /index.php last;
}
location ~ \.php {
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/vhosts/news$fastcgi_script_name;
}
}
/ etc / Nginx / ไซต์ย่อยที่เปิดใช้งาน / แอป:
location ~ .* {
access_log /var/log/nginx/app/access.log;
error_log /var/log/nginx/app/error.log;
rewrite_log on;
index index.php;
root /var/www/vhosts/app/app/webroot;
if (-f $request_filename) {
expires 30d;
break;
}
if (!-e $request_filename) {
rewrite ^.*$ /index.php last;
}
location ~ \.php {
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/vhosts/app/app/webroot$fastcgi_script_name;
}
}
location ^~ /news
ลอง b) สำหรับบล็อกแอปของคุณคุณควรจะสามารถทำได้location /
(ซึ่งไม่เหมือนกันlocation = /
แต่ควรตรงกับทุกอย่างที่ไม่ได้จับคู่ไว้แล้ว c) ในบางกรณี (โดยเฉพาะ regexes) คำสั่งมีความสำคัญ - คุณอาจต้องการรวม 3 ไฟล์เป็นไฟล์เดียวโดยบล็อกในลำดับที่ถูกต้อง นอกจากนี้การใช้ try_files !-e
แทน จนเห็นwiki.nginx.org/HttpCoreModule#location
@
นำหน้า) ที่แมปไปยังแอปเริ่มต้นของคุณ คุณยังสามารถตั้งค่า error_page ที่แม็พ 404 กับตำแหน่งที่ระบุชื่อได้