Các biến httpd.conf: Sự khác biệt giữa $ {var} và% {var} là gì?


7

Sự khác biệt giữa ${var}%{var}trong httpd.conf là gì?

Làm thế nào và khi nào một người sẽ sử dụng ${}%{}?

http://httpd.apache.org/docs/2.4/configuring.html đề cập:

Các giá trị của các biến được xác định bằng Biến môi trường xác định hoặc vỏ có thể được sử dụng trong các dòng tệp cấu hình bằng cú pháp $ {VAR}.

http://httpd.apache.org/docs/2.4/mod/mod_rewrite.html đề cập:

Biến máy chủ: Đây là các biến có dạng% {NAME_OF_VARIABLE}

Mở rộng RewriteMap: Đây là các bản mở rộng có dạng $ {mapname: key | default}.

Sẽ ${VAR}được sử dụng ở mọi nơi trong httpd.conf, ngoại trừ trong lệnh của mod_rewrite (như RewriteCond, RewriteRule nhưng ngoại trừ các bản mở rộng RewriteMap sử dụng ${}như trong RewriteRule ^ / ex /(.*) $ {testplemap: $ 1} )

Một biến được đặt trong httpd.conf bằng SetEnvIfChỉ thị, để sử dụng trong cùng httpd.conf, sẽ được sử dụng như ${var}ngoại trừ khi biến được sử dụng với chỉ thị mod_rewrite, trong đó biến sẽ được sử dụng như %{var}thế nào?

Câu trả lời:


5

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 -Dtù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 RewriteMapsử 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 -Dhoặ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}evà 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:

  1. 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${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 :.
  2. 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ị đó.
  3. 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].

ồ cảm ơn vì đã viết dài dòng Tôi sẽ mất một thời gian để tiêu hóa điều này. Khá kỳ lạ là các tài liệu Apache không ghi lại tài liệu này ở một nơi, điều này hẳn khá khó hiểu với nhiều người mới.
X10

Vâng - tài liệu của họ không tệ đối với các khái niệm cụ thể, nhưng những thứ 'bức tranh lớn' như thế này thì ít rõ ràng hơn nhiều.
Shane Madden

1

Tôi đã xem mã nguồn của mod_rewrite và thấy rằng các ghi chú trong các bình luận (hàm do_Exand):

        /* variable lookup */
        else if (*p == '%') {
        ...
        /* map lookup */
        else {     /* *p == '$' */

vì vậy có vẻ như% là cho các biến chính xác, trong khi $ dành cho tra cứu trong bảng băm ("maps"). ngoài ra, tất cả các mở rộng mod_rewrite hoàn toàn độc lập với lõi - toàn bộ việc mở rộng được thực hiện trong mô-đun.

Tôi đã nghĩ trước đó, nhưng điều đó là sai:

$ {} vars đang sử dụng môi trường của dự án và được đánh giá tại thời điểm phân tích cấu hình.

% {} vars đang sử dụng môi trường của yêu cầu và được đánh giá tại thời điểm yêu cầu được phân tích cú pháp. mod_rewrite sử dụng% {} symantic để ngăn nội suy thời gian cấu hình được tạo bởi lõi httpd.


Cảm ơn, bạn có thể vui lòng bao gồm liên kết đến tài liệu gốc cho việc này và nếu có thể, liên kết đến một hướng dẫn?
X10

Tôi chưa bao giờ thấy rằng trong văn bản rõ ràng trong tài liệu. Đó là cách tôi đã hiểu tại sao điều đó đã được thực hiện. Và đó là sai :)
datacompboy
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.