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.