2012-05-01 24 views
6

Có một thời gian khó cố gắng tìm ra các khối vị trí trong cấu hình nginx. Đây là những gì tôi có:Không thể nhận các khối vị trí được tìm ra trong nginx

server { 
    listen   80; 
    server_name  _; 

    access_log  /var/log/nginx/example.com.access_log; 
    error_log  /var/log/nginx/example.com.error_log warn; 

    root    /var/www/root; 
    index    index.php index.htm index.html; 
    fastcgi_index  index.php; 

    location /wp/ { 
     root    /var/www/wordpress; 
     index    index.php index.htm index.html; 
     fastcgi_index  index.php; 
    } 

    location ~* \.php$ { 
     try_files   $uri =404; 
     keepalive_timeout 0; 
     fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name; 
     fastcgi_pass   127.0.0.1:9000; 
    } 
} 

Browsing để/làm việc như mong đợi và hiển thị trang web trong thư mục/var/www/root, nhưng nếu các vị trí làm việc như tôi nghĩ rằng họ nên duyệt tới/wp nên đưa tôi đến wordpress cài đặt trong/var/www/wordpress. Tất cả tôi nhận được là:

404 Not Found

nginx/0.7.67

Nếu tôi di chuyển thư mục/var/www/thư mục wordpress vào/var/www/root/wordpress và duyệt đến/wordpress tất cả là hoàn hảo.

Tôi đang làm gì sai với khối vị trí ??

Tôi chưa bao giờ định cấu hình nginx trước và là một chút về webb hoàn chỉnh.

Tôi cũng muốn có nhiều khối vị trí hơn cho các ứng dụng khác. Đây thực sự chỉ là một ví dụ cơ bản để đăng trên đây.

Cập nhật nginx lên phiên bản trong Debian Bóp backports. Không cải thiện:

404 Not Found

nginx/1.1.19

+0

Bạn đã thử truy cập/wp/thay vào đó? –

+0

Bạn không muốn tưởng tượng như thế nào hết hạn nginx/0.7.67. – Dayo

+0

Tôi cũng đã thử/wp /. Đây là nginx từ kho Debian 6. Tôi đoán Debian có khuynh hướng tụt lại một chút. Tôi có xu hướng thích gắn bó với những gì trong repos mặc dù. – goji

Trả lời

7

Lý do tại sao nó không được làm việc là ...

Ở cấp máy chủ, bạn có "root/var/www/root". Vì vậy, về cơ bản, mọi khối vị trí sẽ sử dụng điều này trừ khi được ghi đè cụ thể. Đây là thực hành tốt.

Sau đó bạn đã ghi đè nó trong khối vị trí "wp" thành "/ var/www/wordpress". Tuy nhiên, khối vị trí php vẫn đang sử dụng mặc định.

Bây giờ, khi bạn đưa ra yêu cầu "/wp/folder_a/file_a.php" nằm trên thực tế tại "/var/www/wordpress/folder_a/file_a.php", yêu cầu sẽ truy cập khối vị trí php và cho thư mục gốc hoạt động cho khối đó đi tìm tệp trong "/var/www/root/folder_a/file_a.php". Kết quả là bạn nhận được "404 không tìm thấy".

Bạn có thể thay đổi chỉ thị gốc cấp máy chủ thành "/ var/www/wordpress" và xóa ghi đè ở vị trí wp. Điều này sẽ giải quyết vấn đề đó nhưng các tập lệnh php trong "/ var/www/root" sẽ không hoạt động nữa. Không chắc chắn nếu bạn có bất kỳ.

Nếu bạn cần phải chạy php theo cả "/ var/www/root" và "/ var/www/wordpress", bạn cần phải làm điều này:

server { 
    ... 
    root    /var/www/root; 
    index    index.php index.htm index.html; 
    # Keep fastcgi directives together under location 
    # so removed fastcgi_index 

    # Put keepalive_timeout under 'http' section if possible 

    location /wp/ { 
     root    /var/www/wordpress; 
     # One appearance of 'index' under server block is sufficient 
     location ~* \.php$ { 
      try_files   $uri =404; 
      fastcgi_index  index.php; 
      fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name; 
      fastcgi_pass   127.0.0.1:9000; 
     } 
    } 

    location ~* \.php$ { 
     try_files   $uri =404; 
     fastcgi_index  index.php; 
     fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name; 
     fastcgi_pass   127.0.0.1:9000; 
    } 
} 

Đó là, tổ một php trùng lặp khối vị trí dưới khối vị trí wp. Nó sẽ kế thừa chỉ thị gốc cho wp.

Để giúp giữ cho mọi thứ không bị giảm bớt và dễ dàng chỉnh sửa, v.v., bạn có thể đưa chỉ thị fastcgi vào một tệp riêng biệt và đưa nó vào khi cần thiết.

Vì vậy, trong/path/fastcgi.params, bạn phải: sau đó

fastcgi_index  index.php; 
    fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name; 
    fastcgi_pass   127.0.0.1:9000; 

conf của bạn có thể là:

server { 
    ... 
    root    /var/www/root; 
    ... 
    location /wp/ { 
     root    /var/www/wordpress; 
     location ~* \.php$ { 
      try_files   $uri =404; 
      include /path/fastcgi.params; 
     } 
    } 

    location ~* \.php$ { 
     try_files   $uri =404; 
     include /path/fastcgi.params; 
    } 
} 

Bằng cách này, nếu bạn cần phải chỉnh sửa bất kỳ param fastcgi, bạn chỉ cần chỉnh sửa nó trong một nơi.

PS. Cập nhật nginx của bạn sẽ không giải quyết điều này vì nó không phải là một vấn đề phiên bản .. nhưng vẫn cập nhật!

+0

Cảm ơn bạn. Tôi đã nghi ngờ nó đã được sử dụng sai document_root, nhưng không biết bạn có thể ngăn xếp các khối địa điểm như thế! Tôi sẽ đăng lại khi tôi thành công. – goji

+0

Có cách nào để xem chính xác giá trị của SCRIPT_FILENAME là khi một tập lệnh php đang được thực thi không? – goji

+0

'location/wp /' cần phải là 'location^~/wp /' để ngăn chặn vị trí php bên ngoài ghi đè nó. Xem [tài liệu] (http://wiki.nginx.org/HttpCoreModule#location) – kolbyjack

Các vấn đề liên quan