Điểm:0

Làm cách nào để thực hiện chuyển hướng nginx không bao gồm địa chỉ IP và đường dẫn?

lá cờ fr

Tôi cần chuyển hướng đến một URL trừ khi người dùng đến từ bên trong địa chỉ IP nội bộ của chúng tôi hoặc nếu họ đang truy cập một đường dẫn cụ thể.

Tôi đã thử điều này:

vị trí ~* /foobar {
    nghỉ;
}

vị trí ~* / {
    if ($remote_addr != 111.222.333.444) {
        viết lại ^ https://external.tld/
    }
}

Nhưng điều đó dường như không làm việc. Cấu hình cụ thể đó gây ra lỗi 404 khi truy cập https://mydomain.tld/foobar và thông báo "Chào mừng đến với nginx!" trang khi truy cập nó từ bên trong địa chỉ IP của chúng tôi. Tuy nhiên, truy cập https://mydomain.tld/foobar bên ngoài địa chỉ IP của chúng tôi chuyển hướng đúng đến https://external.tld/

djdomi avatar
lá cờ za
Các câu hỏi tìm kiếm trợ giúp về cài đặt, cấu hình hoặc chẩn đoán phải bao gồm trạng thái kết thúc mong muốn, sự cố hoặc lỗi cụ thể, thông tin đầy đủ về cấu hình và môi trường để tái tạo nó cũng như các giải pháp đã thử. Các câu hỏi không có tuyên bố vấn đề rõ ràng sẽ không hữu ích cho những người đọc khác và không có khả năng nhận được câu trả lời hay.
Darrell Brogdon avatar
lá cờ fr
@djdomi Bạn đề xuất điều gì để làm cho tuyên bố vấn đề rõ ràng hơn?
djdomi avatar
lá cờ za
chỉ cho chúng tôi nginx -T và giải thích nghĩa là gì không hoạt động, hiện tại bạn chỉ cho chúng tôi biết nửa chặng đường;)
Darrell Brogdon avatar
lá cờ fr
@djdomi Cảm ơn. Tôi đã làm rõ hơn những gì đang xảy ra với cấu hình đã cho. Thật không may, tôi không được phép đăng kết quả của `nginx -T`.
djdomi avatar
lá cờ za
nếu đó chỉ là một url duy nhất, thì có thể có một tên miền phụ không?
Darrell Brogdon avatar
lá cờ fr
Không, chỉ một URL đó.
Điểm:1
lá cờ gr

Vì bạn không muốn (hoặc không được phép) hiển thị khối máy chủ đầy đủ của mình, nên tôi sẽ phỏng đoán. Điều gì rất có thể xảy ra với cấu hình của bạn? Bạn đã tạo thêm hai khối vị trí được sử dụng để xử lý không tí nào yêu cầu đến. Kiểm tra địa điểm chỉ thị tài liệu. Hai loại vị trí duy nhất có thể vượt qua yêu cầu từ vị trí đối sánh regex là vị trí chính xác (vị trí = /uri {...}) và vị trí tiền tố do-not-check-regex (vị trí ^~ /tiền tố { ... }). Nếu không, vị trí khớp regex đầu tiên sẽ được chọn.

Mọi khối máy chủ đều có thư mục gốc của nó, ngay cả khi nó không được chỉ định rõ ràng bằng cách sử dụng nguồn gốc chỉ thị. Nó được chọn bằng cách sử dụng tiếp đầu ngữ (quy định tại thời gian biên soạn, có thể kiểm tra bằng nginx -V lệnh) và /html hậu tố. Giả sử tiền tố nginx của bạn là /usr/chia sẻ/nginx. Sau đó, gốc mặc định của bạn sẽ ở /usr/share/nginx/html thư mục, trừ khi được chỉ định rõ ràng bằng cách sử dụng gốc/một số/đường dẫn chỉ thị.

Hành vi nginx mặc định khi phục vụ yêu cầu có thể được mô tả là try_files $uri $uri/ =404.

Giả sử chúng ta có một https://mydomain.tld/foobar yêu cầu. Để phục vụ nó đầu tiên của bạn vị trí ~* /foobar { break; } sẽ được chọn làm vị trí biểu thức chính quy phù hợp đầu tiên. Chỉ thị đầu tiên nghỉ có nghĩa là xử lý tập hợp hiện tại của ngx_http_rewrite_module chỉ thị sẽ bị dừng lại. Nhưng không có chỉ thị nào trong số đó (ngoại trừ nghỉ một) bên trong khối vị trí này! Vâng, điều đó có nghĩa là điều này nghỉ chỉ thị là vô ích ở đây. Tiếp theo, nginx sẽ kiểm tra sự tồn tại của một /usr/share/nginx/html/foobar tập tin, một tập tin chỉ mục từ /usr/share/nginx/html/foobar/ thư mục (mặc định là index.html) và sau khi cả hai lần kiểm tra đều không thành công, hãy trả về một Không tìm thấy HTTP 404 lỗi.

Bây giờ hãy giả sử chúng ta có một https://mydomain.tld/ yêu cầu. Khối vị trí đầu tiên của bạn sẽ không khớp với nó, vì vậy khối thứ hai vị trí ~* / { ... } được chọn để xử lý yêu cầu này (khối vị trí này sẽ khớp với mọi yêu cầu hợp lệ có thể có). Nếu kiểm tra địa chỉ IP không vượt qua, chuyển hướng sẽ diễn ra. Nhưng nếu nó vượt qua, nginx sẽ xử lý yêu cầu của bạn theo cách tương tự như được mô tả ở trên, trả lại lời chào mừng mặc định của bạn index.html tập tin từ /usr/share/nginx/html/ danh mục.

Có vẻ như bạn không hiểu làm thế nào các chỉ thị từ ngx_http_rewrite_module được xử lý. Đọc lại phần đầu tiên của tài liệu:

Các nghỉ, nếu, trở lại, viết lại, và bộ chỉ thị được xử lý theo thứ tự sau:

  • các lệnh của mô-đun này được chỉ định ở cấp độ máy chủ được thực hiện tuần tự;
  • nhiều lần:
    • một vị trí được tìm kiếm dựa trên URI yêu cầu;
    • các lệnh của mô-đun này được chỉ định bên trong vị trí tìm thấy được thực hiện tuần tự;
    • vòng lặp được lặp lại nếu URI yêu cầu được viết lại, nhưng không quá 10 lần.

Bạn có thể đặt séc của mình ở cấp khối máy chủ:

nếu ($uri = /foobar) {
    nghỉ;
}
if ($remote_addr != 111.222.333.444) {
    viết lại ^ https://external.tld/
}

ở trên nghỉ chỉ thị sẽ hoạt động như mong đợi, việc thực thi ngx_http_rewrite_module chỉ thị ở cấp độ máy chủ sẽ bị dừng lại. Điều đó có nghĩa là bất kỳ lệnh nào khác từ mô-đun đó (như bộ, nếu, trở lại, viết lại v.v.), nếu có, nên đặt trước khối trên. Điều đó không áp dụng cho ngx_http_rewrite_module chỉ thị được đặt ở cấp vị trí.

Có thêm một cảnh báo có thể. Nếu là của bạn https://mydomain.tld/foobar trang sử dụng bất kỳ nội dung nào (tập lệnh, kiểu, hình ảnh, v.v.), quyền truy cập vào những nội dung đó cũng phải được cho phép. Ví dụ: bạn có thể thay đổi điều kiện để cho phép mọi thứ bắt đầu bằng /foobar tiền tố sử dụng if ($uri ~* ^/foobar) { break; } chặn. Nếu không thể kiểm tra địa chỉ của chúng bằng một biểu thức chính quy, bạn có thể sử dụng một số nếu (...) { ngắt; } khối.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.