กำหนดค่า nginx ด้วยสถานที่ตั้งหลายแห่งที่มีรูทโฟลเดอร์ต่างกันในโดเมนย่อย


202

ฉันต้องการให้บริการรูท URL ของโดเมนย่อยและไดเรกทอรีของโดเมนย่อยไปยังสองโฟลเดอร์ที่แตกต่างกันบนเซิร์ฟเวอร์ของฉัน นี่คือการตั้งค่าแบบง่าย ๆ ที่ฉันมีและไม่ทำงาน ...

server {

    index index.html index.htm;
    server_name test.example.com;

    location / {
            root /web/test.example.com/www;
    }

    location /static {
            root /web/test.example.com/static;
    }
}

ในตัวอย่างนี้test.example.com/จะนำไฟล์ดัชนีมา/web/test.example.com/www

และtest.example.com/staticจะนำไฟล์ดัชนีมา/web/test.example.com/static

คำตอบ:


238

คุณต้องใช้aliasคำสั่งสำหรับlocation /static:

server {

  index index.html;
  server_name test.example.com;

  root /web/test.example.com/www;

  location /static/ {
    alias /web/test.example.com/static/;
  }

}

วิกิพีเดีย Nginxอธิบายความแตกต่างระหว่างรากและนามแฝงที่ดีขึ้นกว่าที่ฉันสามารถ:

โปรดทราบว่ามันอาจดูคล้ายกับคำสั่งรูทตั้งแต่แรกเห็น แต่รูทเอกสารไม่เปลี่ยนแปลงเพียงแค่พา ธ ระบบไฟล์ที่ใช้สำหรับการร้องขอ ส่วนตำแหน่งของคำขอถูกดร็อปในคำขอ Nginx ปัญหา

โปรดทราบว่าrootและaliasจัดการกับเครื่องหมายทับต่อท้ายแตกต่างกัน


67
aliasเขาไม่จำเป็นต้อง โปรดอ่านเอกสารอย่างเป็นทางการไม่ใช่วิกิชุมชนที่ผู้ใช้กรอก ข้อความอ้างอิง: เมื่อตำแหน่งตรงกับส่วนสุดท้ายของค่าของคำสั่งจะเป็นการดีกว่าถ้าใช้คำสั่งรู
VBart

9
สิ่งนี้ได้ผลสำหรับฉันยกเว้นว่ามันไม่มีเครื่องหมายทับ นามแฝงที่ควรอ่าน: alias /web/test.example.com/static/;
ajma

8
@Vart เอกสารนั้นพูดอย่างที่คุณพูดถึงพวกเขาในขณะที่พูด แต่พวกเขาไม่ได้พิสูจน์ให้เห็นถึงคำสั่งนั้น - ดูเหมือนว่าเป็นทางเลือกรูปแบบโดยพลการ คุณเห็นเหตุผลเชิงตรรกะหรือไม่?
Mark Amery

104

ระบบกำหนดตำแหน่งคือ

เช่นเดียวกับที่คุณต้องการส่งต่อคำขอทั้งหมดที่เริ่มต้น/staticและข้อมูลของคุณมีอยู่/var/www/static

ดังนั้นวิธีการง่าย ๆ ก็คือการแยกโฟลเดอร์สุดท้ายออกจากพา ธ เต็มนั่นหมายความว่า

เส้นทางแบบเต็ม: /var/www/static

เส้นทางสุดท้าย: /static และเส้นทางแรก:/var/www

location <lastPath> {
    root <FirstPath>;
}

ดังนั้นมาดูกันว่าคุณทำอะไรผิดพลาดและอะไรคือทางออกของคุณ

ความผิดพลาดของคุณ:

location /static {
    root /web/test.example.com/static;
}

โซลูชันของคุณ:

location /static {
    root /web/test.example.com;
}

2
ที่ช่วยฉันออก: ทำให้ฉันรู้ว่าฉันต้องเปลี่ยนชื่อโฟลเดอร์ของฉันหรือตั้งค่า symlink เพื่อให้สิ่งต่าง ๆ ทำงานได้
cjm

3
ขอบคุณมากฉันล้มเหลวอย่างนี้ :)
bobmoff

10
ดูเหมือนว่าจะมีข้อ จำกัด อย่างมากต่อเสรีภาพในการทำสิ่งที่ฉันต้องการ ฉันต้องการให้ URIs เริ่มต้นด้วยเส้นทางที่แน่นอนที่จะให้บริการจากไดเรกทอรีที่ไม่มีเส้นทาง URI นั้นในเส้นทางของแฟ้มจริง ด้วยวิธีนี้ฉันถูกบังคับให้วางเอกสารของฉันลงในดิสก์ภายใต้เส้นทางที่ลงท้ายด้วย "/ static" ฉันไม่ชอบสิ่งนี้เลย ฉันต้องการอิสระอย่างสมบูรณ์และอิสระในการวางไฟล์ทุกที่ที่ต้องการ
Szczepan Hołyszewski

48
server {

    index index.html index.htm;
    server_name test.example.com;

    location / {
        root /web/test.example.com/www;
    }

    location /static {
        root /web/test.example.com;
    }
}

http://nginx.org/r/root


2
ถามว่าต่างกันอย่างไร
TangMonk

5
@Wooden แตกต่าง: แทนroot /web/test.example.com; root /web/test.example.com/static;nginx แผนที่พา ธ ที่ระบุโดยที่ตั้งกับต้นไม้ diretory และเนื่องจากเส้นทางและไดเรกทอรีแหล่งใช้ชื่อเดียวกันจึงใช้งานrootได้
rmoestl
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.