2013-08-24 34 views
5

Tôi đang chạy một máy chủ trên nginx 1.4.1 với PHP-FastCGI. Hiện tại tôi đã thiết lập để nó xóa dấu gạch chéo theo sau khỏi URL của tôi và phát hành chuyển hướng 301. Tuy nhiên, khi tôi truy cập một thư mục tồn tại, tôi bị buộc vào một vòng lặp chuyển hướng. Gốc tài liệu hiện tại của tôi trông giống như sau:Làm thế nào để loại bỏ dấu gạch chéo sau từ URL trong nginx chỉ khi thư mục không tồn tại?

- index.php (app) 
- webgrind 
    - index.php 
- static 
    - css 

Hiện tại tôi không thể truy cập example.com/webgrind hoặc bất kỳ thư mục nào khác. bản ghi truy cập của tôi liên tục đọc tương tự như:

GET /webgrind/ HTTP/1.1" 301 178 "-" 
GET /webgrind HTTP/1.1" 301 178 "-" 

Đây là khối máy chủ trong nginx.conf tôi:

server { 
     listen 80; 
     server_name example.com; 

     location/{ 
      try_files $uri $uri/ /index.php?$args; 
      root /var/www/example/public; 
      index index.php index.html index.htm; 
     } 

     rewrite ^/(.*)/$ /$1 permanent; 

     location = /favicon.ico { 
      access_log  off; 
      log_not_found off; 
     } 

     location ~ \.php$ { 
      try_files $uri $uri/ /index.php?$args; 
      root /var/www/example/public; 
      index index.php index.html index.htm; 

      fastcgi_pass unix:/var/run/php5-fpm.sock; 
      fastcgi_index index.php; 
      fastcgi_param SCRIPT_FILENAME /var/www/example/public$fastcgi_script_name; 
      fastcgi_param APPLICATION_ENV testing; 
      fastcgi_param PATH /usr/bin:/bin:/usr/sbin:/sbin; 
      fastcgi_intercept_errors on; 
      include  fastcgi_params; 
     } 
    } 

Tôi biết rằng rewrite ^/(.*)/$ /$1 permanent; là dòng vi phạm. Nếu tôi xóa nó và truy cập example.com/webgrind, 301 được cấp cho tôi để chuyển hướng đến example.com/webgrind/ vì đó là thư mục. Tuy nhiên, đơn đăng ký của tôi bây giờ sẽ chấp nhận cả dấu gạch chéo và dấu gạch chéo (ví dụ: example.com/users/ và example.com/users) và đây không phải là những gì tôi muốn.

Bao bì 'nếu' chỉ thị xung quanh viết lại của tôi như sau vẫn tạo ra một vòng lặp chuyển hướng cho thư mục của tôi (if is evil, rõ ràng, nhưng một chỉ thị viết lại trong trường hợp này được coi là an toàn):

if (!-d $request_filename) { 
    rewrite ^/(.*)/$ /$1 permanent; 
} 

(Tôi biết rằng việc truy cập vào webgrind/index.php sẽ giải quyết được vấn đề của tôi, nhưng tôi muốn tránh các vòng chuyển hướng tốn kém và không chuyên nghiệp khi các thư mục sản xuất của tôi được đẩy trực tiếp.)

Vậy làm cách nào tôi có thể loại bỏ dấu gạch chéo chỉ cho các tài nguyên không tồn tại (web của tôi a đường dẫn pplication)?

CẬP NHẬT: My (không thay đổi gì) fastcgi_params config:

fastcgi_param QUERY_STRING   $query_string; 
fastcgi_param REQUEST_METHOD   $request_method; 
fastcgi_param CONTENT_TYPE   $content_type; 
fastcgi_param CONTENT_LENGTH   $content_length; 

fastcgi_param SCRIPT_FILENAME   $request_filename; 
fastcgi_param SCRIPT_NAME    $fastcgi_script_name; 
fastcgi_param REQUEST_URI    $request_uri; 
fastcgi_param DOCUMENT_URI   $document_uri; 
fastcgi_param DOCUMENT_ROOT   $document_root; 
fastcgi_param SERVER_PROTOCOL   $server_protocol; 

fastcgi_param GATEWAY_INTERFACE  CGI/1.1; 
fastcgi_param SERVER_SOFTWARE   nginx/$nginx_version; 

fastcgi_param REMOTE_ADDR    $remote_addr; 
fastcgi_param REMOTE_PORT    $remote_port; 
fastcgi_param SERVER_ADDR    $server_addr; 
fastcgi_param SERVER_PORT    $server_port; 
fastcgi_param SERVER_NAME    $server_name; 

fastcgi_param HTTPS     $https; 

# PHP only, required if PHP was built with --enable-force-cgi-redirect 
fastcgi_param REDIRECT_STATUS   200; 
+0

Một vài điều: 1) Tôi không chắc là tôi hiểu hoàn toàn những gì bạn đang cố gắng để đạt được về hành vi để loại bỏ các dấu gạch chéo - bạn đang cố gắng để đạt được một chuyển hướng cấp độ máy chủ, nơi nếu khách hàng gửi một trong hai ' foo.com/aaa' hoặc 'foo.com/aaa /' mà máy chủ sẽ phản hồi bằng tài liệu; hoặc bạn đang cố gắng để máy chủ yêu cầu trình duyệt chuyển hướng từ 'foo.com/aaa /' sang 'foo.com/aaa'? –

+0

2) Tôi không thể tạo lại vòng lặp chuyển hướng nếu tôi sử dụng khối 'if'. Bạn có thể gặp sự cố nếu bạn đang sử dụng trình duyệt cũ hơn - hãy xem [Internet Explorer 9 Chuyển đổi vĩnh viễn cache] (http://agsci.psu.edu/it/how-to/topics/web/web-development/plone/ khác/internet-explorer-9-vĩnh viễn-cache-chuyển hướng) cho một ví dụ. Vì vậy, điều đó có nghĩa là ngay cả với khối "if", IE sẽ cố gắng chuyển hướng vì nó có ghi đè cũ được lưu trữ. Để giải quyết vấn đề này, bạn phải xóa bộ nhớ cache của trình duyệt. –

+0

@chuex Tôi đang cố gắng để máy chủ yêu cầu khách hàng chuyển hướng từ foo.com/aaa/ đến foo.com/aaa bằng phản hồi 301. Tôi đã thử nghiệm trên Chrome và Firefox mới nhất trên 2 máy tính khác nhau và xóa bộ nhớ cache của tôi và tôi vẫn gặp sự cố này. – danronmoon

Trả lời

5

Đưa các chỉ thị root bên ngoài của khối location như một đứa trẻ trực tiếp của khối server cố định vấn đề này.

server { 
    listen 80; 
    server_name example.com; 

    # This WORKS! 
    root /var/www/example/public; 

    location/{ 
     try_files $uri $uri/ /index.php?$args; 
     index index.php index.html index.htm; 
    } 

    if (!-d $request_filename) { 
     rewrite ^/(.*)/$ /$1 permanent; 
    } 

    location = /favicon.ico { 
     access_log  off; 
     log_not_found off; 
    } 

    location ~ \.php$ { 
     try_files $uri $uri/ /index.php?$args; 
     index index.php index.html index.htm; 

     fastcgi_pass unix:/var/run/php5-fpm.sock; 
     fastcgi_index index.php; 
     fastcgi_param SCRIPT_FILENAME /var/www/example/public$fastcgi_script_name; 
     fastcgi_param APPLICATION_ENV testing; 
     fastcgi_param PATH /usr/bin:/bin:/usr/sbin:/sbin; 
     fastcgi_intercept_errors on; 
     include  fastcgi_params; 
    } 
} 

Dường như đây là một pitfall mà Nginx wiki khuyến cáo nên tránh.

+0

Chỉ cần mở rộng câu trả lời của bạn - cạm bẫy khi có chỉ thị gốc bên trong một khối vị trí là các khối vị trí khác sau đó không có chỉ thị gốc. (Trừ khi chúng có chỉ thị gốc của riêng chúng.) Nếu chỉ thị gốc ở cấp độ máy chủ, thì nó sẽ áp dụng cho tất cả các khối địa điểm. –

+0

Tôi tin rằng việc kiểm tra nếu điều khoản cho một thư mục là một trong những sửa chữa vấn đề… – Daniel

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