2013-07-09 39 views
31

Tôi đang cố gắng đặt biến môi trường trong tệp .htaccess và truy xuất biến đó trong PHP. Tôi đã xem qua một loạt các chủ đề khác ở đây trên SO nhưng tất cả mọi thứ tôi đã cố gắng cho đến nay đã thất bại.Đặt biến môi trường trong .htaccess và truy xuất nó trong PHP

Tôi đã thêm dòng này vào file .htaccess:

SetEnv SPECIAL_PATH /foo/bin 

Tôi đã cố gắng lấy giá trị này bằng cách sử dụng getenv() PHP chức năng:

<?php $specialPath = getenv('SPECIAL_PATH'); ?> 

Tôi đã runned phpinfo() để xem danh sách các biến môi trường có sẵn, SPECIAL_PATH không có ở đó. Tôi bối rối là tại sao điều này không hiệu quả.

Cảm ơn bạn!

+1

bạn có chắc file .htaccess được kích hoạt cho rằng thư mục cụ thể? hãy thử một chỉ thị khác có hiệu quả dễ dàng xác minh được. – goat

+1

câu hỏi SO khác này có giúp bạn không? http://stackoverflow.com/questions/3780866/why-is-my-env-empty – luchosrock

Trả lời

23

Giả sử cấu hình của bạn có AllowOverrides bằng .htaccess, bạn phải bật mod_env trong Apache để làm việc này.

Apache - mod_env

+0

Tôi đoán đây là vấn đề. Tôi đang cố gắng tìm ra cách để kích hoạt các mô-đun Apache (tôi là một tổng newbie với bất cứ điều gì liên quan đến máy chủ), nhưng ít nhất tôi bây giờ biết nơi để tìm. Cảm ơn nhiều. –

+2

Bất cứ nơi nào httpd.conf của bạn được đặt, theo mặc định thường là "conf/httpd.conf" - tìm dòng '#LoadModule env_module modules/mod_env.so' và xóa #, sau đó khởi động lại apache. –

6

Apache Documents tùy chỉnh error.html bao gồm các biến môi trường thông qua kiểm soát lỗi trang

Says "biến môi trường REDIRECT_ được tạo ra từ các biến môi trường đã tồn tại trước khi chuyển hướng. Chúng được đặt tên với tiền tố REDIRECT_, nghĩa là, HTTP_USER_AGENT trở thành REDIRECT_HTTP_USER_AGENT. "

Nói "Không có mục nào trong số này sẽ được đặt nếu mục tiêu ErrorDocument là chuyển hướng bên ngoài (bất kỳ thứ gì bắt đầu bằng tên lược đồ như http :, ngay cả khi nó đề cập đến cùng một máy chủ với máy chủ)."

Nói về SetEnv: "Các biến môi trường nội bộ được thiết lập bởi chỉ thị này được đặt sau khi hầu hết các chỉ thị xử lý yêu cầu ban đầu được chạy, chẳng hạn như kiểm soát truy cập và ánh xạ URI-to-filename. như đầu vào vào giai đoạn đầu của quá trình xử lý như chỉ thị RewriteRule, bạn nên đặt biến môi trường bằng SetEnvIf. "

Trên một số máy chủ, các biến môi trường người dùng tuyên bố phải bắt đầu với 'HTTP_' cho mục đích an ninh, ví dụ như: SetEnv HTTP_MY_VARIABLE "my value"

Dưới đây là một số cách .htaccess thiết và sử dụng các biến môi trường máy chủ, lấy từ sửa đổi của tôi mau hỏng Nhấn 5G Danh sách đen/Tường lửa http://perishablepress.com/5g-blacklist-2013/ để sử dụng báo cáo biến môi trường:

SetEnv myServerName %{SERVER_NAME} 

RewriteCond %{QUERY_STRING} (base64_encode|localhost|mosconfig|open_basedir) [NC,OR] 
RewriteCond %{QUERY_STRING} (boot\.ini|echo.*kae|etc/passwd) [NC,OR] 
RewriteCond %{QUERY_STRING} (GLOBALS|REQUEST)(=|\[|%) [NC] 
RewriteRule .* - [E=badQueryString:%0--%1--%2,F,L] 

SetEnvIfNoCase User-Agent ^$ noUserAgent 
SetEnvIfNoCase User-Agent (binlar|casper|cmsworldmap|comodo|diavol|dotbot|feedfinder|flicky|ia_archiver|jakarta|kmccrew|nutch|planetwork|purebot|pycurl|skygrid|sucker|turnit|vikspider|zmeu) badUserAgent=$1 

<limit GET POST PUT> 
    Order Allow,Deny 
    Allow from all 
    Deny from env=badUserAgent 
</limit> 

Lưu ý việc sử dụng thông số, ví dụ: $ 0 -% 1 -% 2. % 0 cho chuỗi đầy đủ,% 1 cho kết quả phù hợp từ câu lệnh thứ nhất,% 2 the 2nd. Các dấu gạch nối là các ký tự hiển thị bằng chữ, để tách riêng các kết quả tham số bằng hình ảnh (không nghĩ là có cách nào để đặt dấu cách trong đó).


Dưới đây là một số phương pháp PHP truy cập các biến môi trường (trong trường hợp của tôi từ 403.php và 404.php). Lưu ý rằng bạn không tìm trong phpinfo(), nhưng trong $ SERVER và các biến của bạn được bắt đầu bằng REDIRECT Cũng lưu ý rằng với chuyển hướng 403/404, QUERY_STRING trở thành REDIRECT_QUERY_STRING Đây là thứ có thể dễ dàng phụ thuộc vào máy chủ, vì vậy hãy kiểm tra $ _SERVER để biết giá trị thực của bạn.Ví dụ,

if (getenv("HTTP_REFERER") !== FALSE) { 
    $httpref = getenv("HTTP_REFERER"); 
} else { 
    $httpref = ''; 
} 
if (isset($_SERVER['REDIRECT_STATUS'])) { 
    $status = $_SERVER['REDIRECT_STATUS']; 
} else { 
    $status = ''; 
} 
if (isset($_SERVER['REMOTE_HOST'])) { 
    $remoteHost = $_SERVER['REMOTE_HOST']; 
} else { 
    $remoteHost = ''; 
} 

if (isset($_SERVER['REDIRECT_QUERY_STRING'])) { 
    $querystring = $_SERVER['REDIRECT_QUERY_STRING']; 
} else { 
    $querystring = ''; 
} 

if (isset($_SERVER['REDIRECT_noUserAgent'])) { 
    $htaccessErrors[] = 'NoUserAgent'; 
} 
if (getenv("REDIRECT_badQueryString") !== FALSE) { 
/* must exactly match what shows up in $_SERVER, is case sensitive (e.g. badQueryString not BadQueryString) */ 
    $htaccessErrors[] = 'badQueryString:'.getenv("REDIRECT_badQueryString"); 
} 

tôi trang trải trong một số sâu trong http://lcblog.lernerconsult.com/2013-server-alert-you-file-not-found-errors/

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