2010-11-29 6 views
6

Bối cảnh

Tôi có Apache/2.2.15 (Win32) với PHP/5.3.2 được thiết lập, xử lý xác thực.Không thể truy xuất các biến môi trường Apache trong PHP

<Directory /usr/www/myhost/private> 
    # core authentication and mod_auth_basic configuration 
    # for mod_authn_dbd 
    AuthType Basic 
    AuthName "My Server" 
    AuthBasicProvider dbd 

    # core authorization configuration 
    Require valid-user 

    # mod_authn_dbd SQL query to authenticate a user 
    AuthDBDUserPWQuery "SELECT Password,UserName,Realm,Access FROM authn WHERE user = %s" 
</Directory> 

Xác thực hoạt động tốt! Không vấn đề gì.

Nhưng liên quan đến documentation, mọi trường bổ sung được trả lại từ AuthDBDUserPWQuery sẽ được đưa vào biến số AUTHENTICATION_fieldname trong Môi trường.

Với phpinfo(), tôi có thể thấy các biến này với giá trị chính xác trong "Môi trường Apache".

AUTHENTICATE_USERNAME
AUTHENTICATE_REALM
AUTHENTICATE_ACCESS

Vấn đề

tôi không thể tìm nạp các biến môi trường từ php của tôi.

1 <?php 
2 $Access = apache_getenv('AUTHENTICATE_ACCESS',true); 
3 var_dump($Access); 
4 ?> 

Dòng 3 in bool (sai) chỉ ra rằng biến không được tìm thấy!
Tuy nhiên, nếu tôi thay đổi sang một biến Môi trường Apache khác như 'HTTP_HOST' thì nó hoạt động.
..và có, tôi đã thử getenv() cũng vậy, cùng một kết quả.

Cũng có một lưu ý rằng máy chủ Apache cần được biên dịch với APR 1.3.0 để hoạt động. Tôi đã sử dụng Apache msi build từ httpd.apache.org và nó dường như được biên dịch với APR ở trên phiên bản 2. Vì tôi có thể thấy chúng với phpinfo() chúng phải được truy cập từ PHP.

+2

* \ [♦ lưu ý: Xem [lịch sử sửa đổi] (http://stackoverflow.com/posts/4308886/revisions) cho ngữ cảnh của nhận xét này.] * Chúng tôi thường không nói về tiếng Anh của ai đó (của bạn là khá tốt) và nếu định dạng mã của bạn hút ai đó có lẽ sẽ chỉnh sửa nó để nó có thể đọc được. Ngoài ra SO không phải là nơi mọi người được nói với google/rtfm - googling/rtfming là những gì mọi người trả lời có thể làm khi họ sẽ nhận được + đại diện cho nó trong khi nói với bạn để làm như vậy rất có thể sẽ dẫn đến -rep. : p – ThiefMaster

+0

Tôi không có bất kỳ câu trả lời nào cho câu hỏi của bạn, nhưng +1 để có câu hỏi có cấu trúc tốt nhất mà tôi từng thấy trên SO. –

+0

Câu hỏi hoàn toàn hợp lệ, không cần phải phòng thủ. :) Câu trả lời RTFM thường được dành riêng cho nhiều câu hỏi * nhiều * tồi tệ hơn (không). – deceze

Trả lời

1

tôi đã thực hiện một công việc xung quanh,

Nó có vẻ như điều này có thể là một lỗi PHP. Tìm thấy một số lỗi liên quan được báo cáo cho PHP 4 và có thể họ chưa sửa chúng ...

Tôi đã thực hiện một giải pháp mà tôi thực sự không thích (vì tôi đang truy cập bảng userdata Apache), nhưng có vẻ như rằng tôi không có sự lựa chọn.

//************************************************************* 
// If PHP failed to retrieve the AuthDBDUserPWQuery fields. 
// Connect to Apache authentication databaseand create the 
// envirnment variables manually 
// 
if (empty($_ENV['AUTHENTICATE_ACCESS'])) { 
    $Apache = mysql_connect('MyServerIP','MyUserName','MyPassword',false,MYSQL_CLIENT_SSL|MYSQL_CLIENT_COMPRESS); 
    mysql_select_db('MyDatabase',$Apache); 
    $SQLSet = mysql_query("SELECT Realm, Access FROM authenticationtable WHERE UserName='".$_SERVER['PHP_AUTH_USER']."' AND Password='".$_SERVER['PHP_AUTH_PW']."'"); 
    $SQLRow = mysql_fetch_array($SQLSet); 
    $_ENV['AUTHENTICATE_REALM'] = $SQLRow['Realm']; 
    $_ENV['AUTHENTICATE_ACCESS']= $SQLRow['Access']; 
    mysql_close($Apache); 
} 

Nếu PHP không cập nhật $ _ENV đúng, điều này sẽ truy xuất người dùng đã đăng nhập hiện tại từ cùng cơ sở dữ liệu và bảng mà Apache đang sử dụng để xác thực. Sau đó, các trường bổ sung sẽ được ghi vào biến $ _ENV toàn cầu để nó có thể được sử dụng như nó được cho là. Sau khi "lỗi" được sửa, nó sẽ tự động sử dụng $ _ENV ban đầu.

Nếu bất cứ ai có thể mang lại một số thông tin cập nhật về chủ đề này, tôi sẽ được hạnh phúc ...

+1

Và làm thế nào điều này có thể được giảm xuống?!? Tôi tìm thấy một giải pháp cho câu hỏi của riêng tôi và đăng nó để những người khác có thể nhìn thấy nó. Nếu bạn đang đi xuống bỏ phiếu, xin vui lòng nêu lý do tại sao?!? –

3

Tôi đã sử dụng quy tắc mod_rewrite này trong tệp .htaccess để tạo biến môi trường tiêu đề HTTP ủy quyền có sẵn trong $_SERVER['HTTP_AUTHORIZATION']. Tôi chắc chắn điều này có thể được điều chỉnh cho các mục đích của bạn. Không chắc chắn nếu đó là giải pháp tốt nhất, nhưng đó là một giải pháp :

RewriteRule .* - [env=HTTP_AUTHORIZATION:%{HTTP:Authorization},last] 
+0

1 cho cố gắng: D Tôi đã phải đọc lên trên RewriteRule để hiểu những gì bạn đề nghị. Nhưng tôi không nghĩ rằng điều này sẽ làm việc. Nếu tôi hiểu quyền này% {HTTP: Authorization} đã có trong tiêu đề HTTP của bạn và bạn chỉ "sao chép" thông tin đó vào môi trường Apache. Trong trường hợp của tôi, AuthDBDUserPWQuery tạo các biến "môi trường Apache" cho mỗi trường bổ sung (sau mật khẩu) từ câu lệnh SQL. Các giá trị này không xuất hiện ở bất kỳ nơi nào khác. Đây có phải là một lỗi trong PHP mà chỉ các biến Apache được xác định trước mới có thể được truy xuất? –

+0

@Max Hmm, tôi hiểu ... Tôi không có gì khác, thật không may. – deceze

0

Có một đầu mối trong câu trả lời của deceze.Anh ấy đang tìm nạp dữ liệu từ $ _SERVER thay vì $ _ENV.

tôi đã thiết lập một Apache Env Var với

SenEnv MY_VAR "true" trong httpd.conf chính và không thể nhìn thấy nó trong $ _ENV. Đó là mặc dù $ _SERVER.

0

Gần đây tôi đã viết một thư viện để lấy các giá trị từ các biến môi trường và phân tích cú pháp đến các kiểu dữ liệu PHP. Thư viện này có thể được sử dụng để phân tích các biến môi trường thành các kiểu dữ liệu PHP (như đúc thành số nguyên, float, null, boolean), phân tích các cấu trúc dữ liệu phức tạp như chuỗi JSON và nhiều hơn nữa với sự đóng góp của cộng đồng.

Thư viện hiện có sẵn ở đây: https://github.com/jpcercal/environment

Cài đặt biến môi trường của bạn với .htaccess bằng ví dụ:

SetEnv YOUR_ENV_VARIABLE_NAME the-value-of-your-env-var 

Và để có được các giá trị từ biến môi trường (độc lập với môi trường CLI, Apache, Nginx , Máy chủ tích hợp sẵn PHP và hơn thế nữa) để thực hiện:

<?php 
// ... 
require "vendor/autoload.php"; 
// ... 
var_dump(Cekurte\Environment\Environment::get("YOUR_ENV_VARIABLE_NAME")); 

Hãy tận hưởng nó.