Định cấu hình nginx với nhiều vị trí với các thư mục gốc khác nhau trên tên miền phụ


202

Tôi đang tìm cách phục vụ url gốc của một tên miền phụ và thư mục của một tên miền phụ cho hai thư mục khác nhau trên máy chủ của tôi. Đây là cách thiết lập đơn giản mà tôi có và không hoạt động ...

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;
    }
}

Trong ví dụ này test.example.com/sẽ mang tệp chỉ mục vào/web/test.example.com/www

test.example.com/staticsẽ mang tập tin chỉ mục vào/web/test.example.com/static

Câu trả lời:


238

Bạn cần sử dụng aliaschỉ thị cho 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/;
  }

}

Các wiki nginx giải thích sự khác biệt giữa rễ và bí danh tốt hơn tôi có thể:

Lưu ý rằng nó có thể trông giống với lệnh gốc ngay từ cái nhìn đầu tiên, nhưng gốc tài liệu không thay đổi, chỉ là đường dẫn hệ thống tệp được sử dụng cho yêu cầu. Phần vị trí của yêu cầu được bỏ trong các vấn đề Nginx yêu cầu.

Lưu ý rằng rootaliasxử lý dấu gạch chéo khác nhau.


67
Anh ta không cần alias. Xin vui lòng, đọc các tài liệu chính thức , không phải wiki cộng đồng được điền bởi người dùng. Trích dẫn: Khi vị trí khớp với phần cuối của giá trị của lệnh, tốt hơn là sử dụng lệnh gốc .
VBart

9
Điều này làm việc cho tôi ngoại trừ việc nó thiếu một dấu gạch chéo. Bí danh nên đọc: bí danh /web/test.example.com/static/;
ajma

8
@VBart các tài liệu nói chính xác những gì bạn trích dẫn họ nói, nhưng họ không biện minh cho hướng dẫn đó - nó có vẻ như là một lựa chọn phong cách tùy ý. Bạn có thấy lý do hợp lý nào đằng sau nó không?
Đánh dấu Amery

104

Hệ thống chỉ thị địa điểm là

Giống như bạn muốn chuyển tiếp tất cả yêu cầu bắt đầu /staticvà dữ liệu của bạn hiện diện trong/var/www/static

Vì vậy, một phương thức đơn giản được tách thư mục cuối cùng khỏi đường dẫn đầy đủ, điều đó có nghĩa là

Đường dẫn đầy đủ : /var/www/static

Đường dẫn cuối cùng: /static và đường dẫn đầu tiên:/var/www

location <lastPath> {
    root <FirstPath>;
}

Vì vậy, hãy xem những gì bạn đã làm sai và giải pháp của bạn là gì

Lỗi của bạn :

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

Giải pháp của bạn:

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

2
Điều đó đã giúp tôi ra ngoài: khiến tôi nhận ra mình cần phải đổi tên thư mục của mình hoặc thiết lập một liên kết tượng trưng để làm cho mọi thứ hoạt động.
cjm

3
cảm ơn bạn rất nhiều, tôi đã thất bại chính xác theo cách này :)
bobmoff

10
Điều này có vẻ như là một giới hạn khá TUYỆT VỜI đối với Tự do làm những gì tôi muốn. Tôi muốn các URI bắt đầu bằng một đường dẫn nhất định được phục vụ từ một thư mục không chứa đường dẫn URI đó trong đường dẫn tệp vật lý của nó. Với giải pháp này, tôi bị buộc phải đặt tài liệu của mình vào đĩa theo đường dẫn kết thúc bằng "/ static". Tôi không thích điều này cả. Tôi muốn tự do tuyệt đối và hoàn toàn để đặt các tập tin bất cứ nơi nào tôi muốn.
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
Có gì khác với hỏi?
TangMonk

5
@Wooden sự khác biệt: root /web/test.example.com;thay vì root /web/test.example.com/static;. nginx ánh xạ đường dẫn được chỉ định bởi vị trí vào cây diretory và vì đường dẫn và thư mục nguồn có cùng tên, nên nó hoạt động với root.
rmoestl
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.