2015-01-22 15 views
6

Tôi thấy rằng $ request_uri của nginx sao chép các tham số truy vấn.

Mục tiêu tôi muốn đạt được là chuyển hướng bất kỳ yêu cầu nào của miền rỗng đến miền www. Đây là một cấu hình mẫu.

server { 
     listen  8080; 
     server_name localhost;  
     location/{ 
      if ($http_host !~* "^www\.") { 
       rewrite (.*) http://www.$http_host$request_uri permanent; 
      } 
     } 
    } 

Kết quả tôi nhận được là:

curl -I http://127.0.0.1:8080/pp/\?a\=b 

HTTP/1.1 301 Moved Permanently 
Server: nginx/1.6.2 
Date: Thu, 22 Jan 2015 04:07:39 GMT 
Content-Type: text/html 
Content-Length: 184 
Connection: keep-alive 
Location: http://www.127.0.0.1:8080/pp/?a=b?a=b 

Tham số truy vấn được nhân đôi trong kết quả; Am i thiếu cái gì ở đây?

+0

Bạn có tìm thấy giải pháp này không? – dgilperez

+1

Điều này sẽ được chuyển đến ServerFault. http://serverfault.com/ –

Trả lời

2

if is evil (không phải lúc nào, nhưng) vậy tại sao không thử quay trở lại 301:

server { 
    server_name example.com; 
    return 301 $scheme://www.example.com$request_uri; 
} 

server { 
    server_name www.example.com; 
    root /var/www; 
    location/{ 
    index index.html; 
    } 
} 
+0

Hmm có vẻ như tôi không liên quan gì đến '' if'', nhưng thay đổi chỉ thị '' rewrite'' thành '' return 301''. Trong trường hợp của tôi tôi không có ifs, nhưng viết lại là như nhau và tùy chọn của bạn làm việc cho tôi. Bất kỳ ý tưởng tại sao '' return'' hoạt động và '' rewrite'' không? Làm thế nào bạn sẽ viết này với một '' viết lại''? – dgilperez

+3

trả lại 301 là thực hành tốt hơn sau đó viết lại, vì vậy tôi sử dụng trở lại trong ví dụ của tôi :) –

+2

Tôi đã cải thiện mã của bạn để sử dụng '$ scheme' thay vì hardcoding' http: // 'trong URL chuyển hướng, theo cách đó ví dụ làm việc liên tục cho cả HTTP và HTTPS. –

9

Việc nhân rộng các thông số truy vấn mà bạn thấy là một hành vi mong đợi của Nginx. Để thay đổi điều này, bạn cần phải thêm một trailing ? để viết lại như trong:

server { 
     listen  8080; 
     server_name localhost;  
     location/{ 
      if ($http_host !~* "^www\.") { 
       rewrite (.*) http://www.$http_host$request_uri? permanent; 
      } 
     } 
    } 

See Documentation Here.

Nếu chuỗi thay thế bao gồm đối số yêu cầu mới, đối số yêu cầu trước được nối thêm sau. Nếu đây là không mong muốn, hãy đặt dấu chấm hỏi ở cuối chuỗi thay thế tránh để chúng được thêm vào, ví dụ:

viết lại ^/users /(.*)$/show? User = $ 1? Cuối cùng;

Tuy nhiên, cấu hình do Aleksey Deryagin là lựa chọn tốt hơn và hiệu quả hơn cho loại hình mong muốn của bạn chuyển hướng vì mọi yêu cầu sẽ được đánh giá bởi if khối trong cấu hình ban đầu của bạn cho dù cần thiết hay không.

+0

Cảm ơn! Chỉ cần làm rõ: nếu bạn thêm dấu "'? "' Vào viết lại, toàn bộ chuỗi truy vấn bị tước, hoặc nó không bị trùng lặp? tức là, với đuôi ''? '', url sẽ trở thành '' http: //www.127.0.0.1: 8080/pp /? a = b''? – dgilperez

+0

Được bỏ phiếu để sử dụng không cần thiết khi viết lại URL. –

+0

@dgilperez URL sẽ trở thành 'http: //www.127.0.0.1: 8080/pp /? A = b'. Việc thêm dấu "?" Chỉ đơn giản là dừng chuỗi truy vấn để được thêm vào lần thứ hai. Như tôi đã đề cập trong câu trả lời của tôi mặc dù, bằng cách sử dụng phương pháp viết lại trong trường hợp cụ thể này không phải là cách hiệu quả nhất để đi về loại chuyển hướng này. – Dayo

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