Điểm:0

Chỉ thị `location` không có hiệu lực khi nó chứa một biến

lá cờ no

Những gì tôi muốn

cho tôi /quản trị viên vị trí, đưa vào danh sách trắng một số địa chỉ IP đáng tin cậy và chặn mọi người khác.

Tôi có gì

http {
    bản đồ $remote_addr $admin_block_path {
        mặc định "/ quản trị viên";
        1.1.1.1 "/not-admin";
        8.8.8.8 "/not-admin";
    }

    # â¦

    người phục vụ {
        add_header X-Test-Admin "$admin_block_path";
        vị trí $admin_block_path {
            trả lại 403;
        }
    }

}

Ý tưởng là để sử dụng bản đồ xác định có điều kiện đường dẫn để chặn từ địa chỉ IP của khách truy cập. Lưu trữ nó trong một biến và sử dụng biến đó trong địa điểm. Nếu yêu cầu đến từ một IP không đáng tin cậy, biến sẽ chứa /quản trị viên, và do đó vị trí sẽ chặn /quản trị viên.

vấn đề là gì

Các địa điểm không chặn truy cập vào /quản trị viên.

  • Tôi có thể xác nhận sử dụng add_header rằng biến được đặt chính xác dựa trên địa chỉ IP. Khi truy cập từ một IP không đáng tin cậy, tôi nhận được /quản trị viên, và tương ứng /không phải quản trị viên khi truy cập từ một IP đáng tin cậy.
  • Nếu tôi thay thế vị trí $admin_block_path với mã hóa cứng vị trí / quản trị viên, yêu cầu không bị chặn
  • Đã thử chơi với dấu ngoặc kép, không có hiệu lực
  • Đã thử lấy dấu gạch chéo bên ngoài biến, không có tác dụng

Ghi chú

Thật không may, tôi không thể mã hóa đơn giản cho phép/phủ nhận vào một số /quản trị viên location vì điều đó sẽ ghi đè cấu hình vượt qua PHP mà tôi có ở nơi khác trong tệp config. Vì điều này, tôi cần phải có một chuyên dụng /quản trị viên chỉ vị trí nếu tôi biết dù sao thì tôi cũng sẽ từ chối yêu cầu và không cần PHP.

Phiên bản Nginx: 1.20.1

Điểm:3
lá cờ gr

Tất cả các vị trí trong cấu hình nginx được biên dịch khi khởi động. Bạn không thể sử dụng các biến cho địa điểm tham số chỉ thị (cũng như bạn không thể sử dụng các biến bên trong các mẫu biểu thức chính quy hoặc với một số chỉ thị khác). Ngoài ra, khi tài liệu chỉ thị nginx không nêu rõ ràng rằng bạn có thể sử dụng các biến cho tham số của một số chỉ thị, điều đó thường có nghĩa là bạn không thể. Bạn nên sử dụng một số kỹ thuật khác để đạt được những gì bạn muốn. Một trong những giải pháp có thể như sau:

bản đồ $remote_addr $admin_block_path {
    1.1.1.1"";
    8.8.8.8"";
    mặc định 1;
}

người phục vụ {
    nếu ($admin_block_path) {
        viết lại ^/admin /bị chặn;
    }
    vị trí = /bị chặn {
        nội bộ;
        trả lại 403;
    }
    ...
}

Một vị trí đối sánh chính xác có mức độ ưu tiên cao hơn so với vị trí regex, do đó, vị trí này sẽ không phá vỡ cấu hình trình xử lý PHP của bạn. Đặt vị trí đó thành nội bộ, bạn có thể yên tâm rằng sẽ không thể truy cập trực tiếp vào vị trí đó (chỉ thông qua quy tắc viết lại).

mehov avatar
lá cờ no
Cảm ơn bạn đã giúp đỡ của bạn, phương pháp này đã làm việc

Đă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.