Làm cách nào tôi có thể sử dụng SetEnv If để đặt biến dựa trên Máy chủ lưu trữ?


11

Tôi đang cố gắng thiết lập một biến trên Apache

ENV = DEV nếu máy chủ http là URL dev

hoặc là

ENV = PRD nếu máy chủ http là URL prd

và sau đó sử dụng $ _SERVER ['ENV'] để tạo một số nhánh logic

Cho đến nay không ai trong số này đã làm việc cho tôi và chúng tôi đã cài đặt mô-đun setenvif

SetEnvIfNoCase Referer
SetEnvIfNoCase Remote_Host

Cách đúng đắn để làm điều này là gì?

Câu trả lời:


15

Xem nhanh tài liệu :

Lệnh SetEnv If xác định các biến môi trường dựa trên các thuộc tính của yêu cầu. Thuộc tính được chỉ định trong đối số đầu tiên có thể là một trong ba điều sau:

Trường tiêu đề yêu cầu HTTP (xem RFC2616 để biết thêm thông tin về những điều này); ví dụ: Máy chủ, Tác nhân người dùng, Người giới thiệu và Ngôn ngữ chấp nhận. Một biểu thức chính quy có thể được sử dụng để chỉ định một bộ tiêu đề yêu cầu.

Vì vậy, chắc chắn có thể tạo một biến môi trường có điều kiện trên Hosttiêu đề. Có vẻ như bạn đang cố gắng sử dụng Refererhoặc Remote_Hosttiêu đề, không phải cái nào cũng chính xác là thứ bạn muốn (mặc dù về lý thuyết Referernên chứa giá trị của Hosttiêu đề trong hầu hết các trường hợp). Remote_Hostsẽ là tên máy chủ của ứng dụng khách thực hiện yêu cầu, không phải là tất cả những gì bạn muốn (và trong hầu hết các cấu hình sẽ không có sẵn, vì nó thường bị tắt tra cứu DNS vì lý do hiệu suất).

Hãy thử một cái gì đó như thế này:

SetEnvIf Host "www-dev\.example\.com" ENV=DEV
SetEnvIf Host "www-production\.example\.com" ENV=PRD

... và sau đó sử dụng $ _SERVER ['ENV'] để tạo một số nhánh logic

Nhưng cũng lưu ý rằng bạn chỉ có thể tham chiếu giá trị của Hosttiêu đề trực tiếp trong PHP mà không cần thông qua phương thức này; $_SERVER['HTTP_HOST']sẽ có chính xác những gì bạn muốn.


Xinh đẹp. Điều này cho phép tôi viết các quy tắc tùy chỉnh để yêu cầu mật khẩu khi kết nối với một số Máy chủ nhất định, nhưng không phải các quy tắc khác (nghĩa là bảo vệ hộp dàn khi một VM được sao chép vào nhiều phiên bản Amazon EC2, nhưng không viết công thức nấu Chef tùy chỉnh). Rất hữu ích, nếu khó tìm kiếm, chức năng.
Eric L.

1
Các SetEnvIftài liệu nói rằng thông số thứ 3 là một biểu thức chính quy, các dấu chấm trong tên miền có nên được thoát bằng dấu gạch chéo ngược không? Hay việc trích dẫn giá trị trong dấu ngoặc kép làm cho Apache coi nó như một chuỗi ký tự?
jakub.g

@ jakub.g Vâng, họ là một regex và nên được trốn thoát. Trong trường hợp này, vì một dấu chấm khớp với bất kỳ ký tự đơn nào, một biểu thức chính quy "www-dev.example.com"cũng sẽ khớp với các Tên máy chủ không mong muốn, chẳng hạn như www-dev-example.com. Bạn sẽ nhận được các trận đấu dự kiến ​​và nhiều hơn nữa. Tôi đã cập nhật ví dụ bây giờ.
Martijn Heemels
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.