2013-06-12 46 views
9

Tôi đang cố chuyển một biến môi trường từ .htaccess sang PHP. Điều này hoạt động tốt trên máy chủ WAMP cục bộ của tôi, nhưng trên máy chủ mà trang web của tôi được lưu trữ, nó không thành công mà không có lý do.Biến môi trường không được chuyển từ .htaccess sang PHP

Dưới đây là cấu hình thử nghiệm của tôi:

.htaccess:

SetEnv TEST_VARIABLE test_value 

test.php:

<pre> 
getenv('TEST_VARIABLE') = <?php print getenv('TEST_VARIABLE'); ?> 

getenv('REDIRECT_TEST_VARIABLE') = <?php print getenv('REDIRECT_TEST_VARIABLE'); ?> 
</pre> 

Trên máy chủ địa phương của tôi, nhận được một cách chính xác test.php trả:

getenv('TEST_VARIABLE') = test_value 
getenv('REDIRECT_TEST_VARIABLE') = 

Nhưng trên production server, nó sẽ trả về:

getenv('TEST_VARIABLE') = 
getenv('REDIRECT_TEST_VARIABLE') = 

Những điều tôi đã loại trừ khả năng:

  1. mod_env không được cài đặt/kích hoạt bởi máy chủ. Không thể, bởi vì sau đó SetEnv sẽ không được nhận dạng và tôi sẽ nhận được 500 trong khi xử lý .htaccess.

  2. AllowOverrides trong httpd.conf cho thư mục này không bao gồm FileInfo. Không thể được, bởi vì sau đó Apache sẽ ném một lỗi "SetEnv không được phép ở đây" khi gặp phải chỉ thị SetEnv và tôi sẽ nhận được 500 một lần nữa.

  3. variables_order trong php.ini không bao gồm 'E'. Điều này sẽ giải thích rằng siêu dữ liệu $_ENV bị trống rỗng (có nghĩa là), nhưng không phải lý do tại sao getenv() không trả lại giá trị cho các biến này.

  4. Toàn bộ môi trường bị hỏng. Không thể, vì getenv('PATH')getenv('SERVER_NAME') vẫn trả về giá trị hợp lệ.

Tại thời điểm này tôi không biết cấu hình nào có thể gây ra điều này.

Trả lời

6

Tôi không nghĩ rằng việc sử dụng setenv thường hoạt động trong .htaccess. Đó là lệnh shell script (bash, C shell, v.v.). Nếu máy chủ của bạn không bộ phận hỗ trợ, theo số https://kb.mediatemple.net/questions/36/Using+Environment+Variables+in+PHP#gs bạn cần có tên biến bắt đầu bằng HTTP_.

+3

SetEnv _is_ một lệnh .htaccess, nhưng bạn đã đóng đinh: khi tôi đã thêm tiền tố biến với HTTP_, mọi thứ đã hoạt động. Tôi đã không thấy yêu cầu đó được ghi lại trong bất kỳ nguồn "chính thức" nào, điều này thật kỳ lạ, nhưng này, nếu nó hoạt động không chạm vào nó, phải không? – nitwit

+1

Yêu cầu tương tự dường như đi cho RewriteRule. * - (E = HTTP_VAR: VAL) trên một số máy chủ. – Chris

+0

chỉ chạy vào cùng một vấn đề này, thật kỳ lạ là nó không được ghi chép ở bất cứ đâu. Trong trường hợp của tôi, điều này đã không xảy ra với một kịch bản PHP, mà đúng hơn là trong Perl. – insaner

4

Nếu bạn đang chạy máy chủ tại nhà trên máy Mac hoặc đã bật suEXEC, có các biện pháp bảo mật để loại bỏ bất kỳ biến môi trường không phải http nào được xác định, do đó chúng sẽ không xuất hiện trong $ _ENV ['APPLICATION_ENV' ]. Bạn CÓ THỂ, tuy nhiên truy cập các thông qua một chức năng PHP bản địa để có được điều tương tự.

$var = apache_getenv('APPLICATION_ENV'); 

chức năng đó sẽ nhận được bất kỳ biến môi trường được xác định với setenv trong tập tin .htaccess của bạn, hoặc bất kỳ biến môi trường được thiết lập trong php.ini, ngay cả khi PHP loại bỏ những từ biến $ _ENV.

Sau đó bạn có thể xác định biến môi trường trong PHP nếu bạn muốn, mặc dù không được khuyến nghị.

$_ENV['APPLICATION_ENV'] = apache_getenv('APPLICATION_ENV'); 

Hoặc là giải pháp tốt hơn: chỉ cần xác định một toàn cầu:

define('APPLICATION_ENV', apache_getenv('APPLICATION_ENV')); 

Khi bạn làm điều đó, nó sẽ hoạt động như mong muốn.

Các vấn đề liên quan