Sự khác biệt giữa $ {var} và% {var} trong httpd.conf là gì?
Khá nhiều thứ. Không có quy tắc khó và nhanh nào nói rằng " $
does x, %
does y", bởi vì chúng làm những việc khác nhau tùy thuộc vào vị trí và cách chúng được sử dụng.
$ {VAR} sẽ được sử dụng ở mọi nơi trong httpd.conf, ngoại trừ trong chỉ thị mod_rewrite
Không - ${VAR}
được áp dụng như một sự thay thế ở mọi vị trí trong toàn bộ cấu hình, ngay cả trong một dòng liên quan đến mod_rewrite. Chúng chỉ có thể được xác định khi khởi động bằng cách sử dụng -D
tùy chọn được chuyển sang nhị phân httpd hoặc lệnh Define
.
Điều này có thể được thực hiện bởi vì các biến đó không được chứa một :
ký tự, trong khi việc RewriteMap
sử dụng phải chứa một :
ký tự. Điều này cho phép $
sử dụng theo những cách cực kỳ khác nhau mà không có xung đột - trình phân tích cú pháp nhìn thấy :
và biết rằng nó không được phép thay thế điều đó.
Một biến được đặt trong httpd.conf bằng cách sử dụng SetEnv If Directive, để sử dụng trong cùng httpd.conf, sẽ được sử dụng như $ {var} trừ khi biến được sử dụng với chỉ thị mod_rewrite, trong đó biến sẽ được sử dụng là% {var}?
Không. Các biến môi trường không giống như các biến được đặt qua -D
hoặc Define
- chúng là một bối cảnh theo yêu cầu hoàn toàn riêng biệt (đó là các biến bạn đang đặt SetEnvIf
), mà chỉ một số chỉ thị nhất định sẽ sử dụng. Chúng được đề cập cụ thể ở những nơi được hỗ trợ - trong mod_rewrite %{ENV:variable}
, trong nhật ký của chúng %{variable}e
và rất nhiều chỉ thị có kiểm tra logic giống như vậy env=variable
.
Nên về cơ bản; đó là một mớ hỗn độn khó hiểu - một minh chứng cho lịch sử của máy chủ web trong vài thập kỷ qua. Có lẽ điều chính khiến bạn bối rối là cú pháp của mod_rewrite không mở rộng sang bất kỳ phần nào khác của cấu hình theo bất kỳ cách nào; tất cả đều khác nhau. Điểm chính cần rút ra từ tất cả những điều này là không có "quy tắc" chi phối để làm cho tất cả những điều này có ý nghĩa - một $
điểm có nghĩa là một cái gì đó hoàn toàn khác với một $
điểm khác.
Một vài điểm tham khảo tiện dụng:
- Nếu bạn đang tìm cách đặt một biến tĩnh khi Apache khởi động, hãy sử dụng
Define
và ${VAR}
thay thế một lần, khi khởi động của Apache. Điều này chủ yếu hữu ích khi bạn muốn làm một cái gì đó như chia sẻ tệp cấu hình giữa môi trường phát triển và sản xuất - nhưng không nên nhầm lẫn với việc sử dụng $
từ RewriteMap
, luôn chứa a :
.
- Nếu bạn đang tìm cách làm việc với các biến trong các yêu cầu cụ thể, thì biến môi trường là thứ bạn đang theo đuổi - nhưng bạn không thể đưa ra các giả định về cú pháp mà bạn sẽ sử dụng để nhận chúng khi được sử dụng với một chỉ thị cụ thể. Bạn sẽ cần kiểm tra tài liệu cho chỉ thị đó.
- Khi mod_rewrite có vấn đề, hãy loại bỏ mọi thứ bạn nghĩ bạn biết về các biến và cú pháp của chúng. Nó có tập hợp các biến riêng
%{VAR}
, bạn có thể nhận các biến môi trường 'bình thường' của mình %{ENV:VAR}
và bạn có thể đặt các biến môi trường với [E=VAR]
.