2015-02-17 16 views
6

Tôi có một ứng dụng được phát triển bằng cách sử dụng angularjs và toàn bộ ứng dụng tải khi dist/folder được truy cập.nginx phục vụ từ tĩnh nếu không tìm thấy thử reverse proxy

gì đang cố gắng todo là, khi trang không tìm thấy trên angularjs, thử trên một reverse proxy, tôi đã cố gắng để làm việc thiết lập dưới đây nhưng nginx không cho phép thiết lập cùng một vị trí hai lần trong khối duy nhất

server { 
    listen 80; 
    server_name example.com; 
    keepalive_timeout 60; 
    client_max_body_size 10M; 
    root /var/lib/www/dist; 
    charset utf-8; 

    location/{ 
     expires -1; 
     add_header Pragma "no-cache"; 
     add_header Cache-Control "no-store, no-cache, must-revalidate, post-check=0, pre-check=0"; 
     root /var/lib/www/dist; 
     try_files $uri $uri/ /index.html =404; 
    } 

    location/{ 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
     proxy_set_header Host $http_host; 
     proxy_redirect off; 
     proxy_buffering off; 
     proxy_http_version 1.1; 
     proxy_set_header Connection ""; 
     if (!-f $request_filename) { 
      proxy_pass http://app_root; 
      break; 
     } 
    } 

    error_page 500 502 503 504 /500.html; 
    location = /500.html { 
     root /var/lib/app/etc/templates; 
    } 

} 

về cơ bản, nếu URL 404'ed trên angularjs tôi muốn thử và chuyển nó đến proxy_pass http://app_root; bất kỳ ai có thể tư vấn về cách đạt được thiết lập này?

Cảm ơn,

CẬP NHẬT

Vì vậy, đang cố gắng tiếp cận được đề xuất bởi "Mohammad AbuShady", và cập nhật cài đặt nginx của tôi để sau, nhưng vẫn không làm việc, thay vào đó nó cố gắng để tìm trang trong AngularJS ứng dụng và không di chuyển đến các thiết lập up_stream @proxy

upstream app_root { 
    server unix:/tmp/app_root.sock fail_timeout=0; 
} 

server { 
    listen 80; 
    server_name example.com; 
    keepalive_timeout 60; 
    client_max_body_size 10M; 
    root /var/lib/www/dist; 
    charset utf-8; 

    location/{ 
     expires -1; 
     add_header Pragma "no-cache"; 
     add_header Cache-Control "no-store, no-cache, must-revalidate, post-check=0, pre-check=0"; 
     root /var/lib/www/dist; 
     try_files $uri$args $uri$args/ $uri/ /index.html @proxy; 
    } 

    location @proxy { 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
     proxy_set_header Host $http_host; 
     proxy_redirect off; 
     proxy_buffering off; 
     if (!-f $request_filename) { 
      proxy_pass http://app_root; 
      break; 
     } 
    } 

    error_page 500 502 503 504 /500.html; 
    location = /500.html { 
     root /var/lib/app/etc/templates; 
    } 

} 
+0

Vậy url thực sự là gì khi bạn hiển thị trang 404? –

Trả lời

8

Bạn đang hơn suy nghĩ nó, một địa điểm duy nhất có thể xử lý nó và sau đó cung cấp cho nó một fallback

location/{ 
    # omitted extra settings 
    # check notes below 
    try_files $uri @proxy; 
} 

location @proxy { 
    # omitted proxy settings 
    proxy_pass http://app_root; 
} 

Ghi chú:

  1. Không cần cho một gốc thứ hai bên trong vị trí, nó đã được xác định trong khối máy chủ
  2. Tôi đã xóa $uri/ vì bạn không có index trong máy chủ của mình.
  3. tôi cũng loại bỏ /index.html, nếu bạn muốn sử dụng nó thì bạn có thể muốn xác định nó như là chỉ mục trong khối máy chủ và đặt $uri/ lại

    server { 
        index index.html; 
        location/{ 
        try_files $uri $uri/ @proxy; 
        } 
    } 
    
  4. Tôi không có ý tưởng nơi app_root, nhưng Tôi cho rằng đó là một thượng lưu được định nghĩa ở một nơi khác.
+0

Xin chào mohamed, tôi đã cố gắng tiếp cận bạn đề xuất ở trên, nó đã không hoàn toàn làm việc ra, tôi cập nhật câu hỏi của tôi và thêm chi tiết từ conf nginx .. bạn có thể vui lòng tư vấn? –

+0

giải thích dòng này 'try_files $ uri $ argi $ uri $ args/$ uri//index.html @proxy;' –

+0

lấy cảm hứng từ bài đăng này https://gist.github.com/cjus/b46a243ba610661a7efb vì angularjs chuyển $ uri và $ args đến index.html để hiển thị, tôi đã thử vài cách tiếp cận từ các sách hướng dẫn khác nhau và chỉ có một hướng dẫn này hoạt động, những người khác cũng làm việc. nhưng có vấn đề khi làm mới trang –

-1

Cố gắng Mo này:

server { 
listen 80; 
server_name example.com; 
keepalive_timeout 60; 
client_max_body_size 10M; 
root /var/lib/www/dist; 
charset utf-8; 

location/{ 
    expires -1; 
    add_header Pragma "no-cache"; 
    add_header Cache-Control "no-store, no-cache, must-revalidate, post-check=0, pre-check=0"; 
    root /var/lib/www/dist; 
    try_files $uri $uri/ /index.html =404; 
    error_page 404 = @404; 
} 

location/{ 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header Host $http_host; 
    proxy_redirect off; 
    proxy_buffering off; 
    proxy_http_version 1.1; 
    proxy_set_header Connection ""; 
    if (!-f $request_filename) { 
     proxy_pass http://app_root; 
     break; 
    } 
} 

location @404 { 
    proxy_pass http://app_root; 
} 

error_page 500 502 503 504 /500.html; 
location = /500.html { 
    root /var/lib/app/etc/templates; 
} 

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