2012-10-19 39 views
12

Tôi cần chạy legacy PHP application trong môi trường lưu trữ được chia sẻ. Tôi đã hứa với khách hàng của mình rằng tôi sẽ hỗ trợ ứng dụng kế thừa đó một thời gian nhưng tôi thấy rằng nó không hoạt động vì nó sử dụng rộng rãi việc không được chấp nhận $HTTP_POST_VARS.

Hạ cấp PHP không phải là một tùy chọn. Vá ứng dụng có thể không khả thi vì tệp PHP được tạo từ tệp thực thi Windows (tôi không đùa!) Và mỗi lần trang web được tạo lại từ máy tính để bàn, chúng tôi có thể mất các sửa đổi.

Tôi hỏi liệu có cách nào yêu cầu PHP giới thiệu lại $HTTP_POST_VARS cho tất cả các trang web trên máy chủ lưu trữ hay chỉ cho một vhost cụ thể. Bất kỳ khác tùy chọn/đề nghị được đánh giá cao

+2

Bây giờ tôi nghĩ về nó, câu hỏi này có vẻ thích hợp cho serverfault * quá * ... –

+4

argh .... những loại khách hàng này .... Một nỗi đau tôi hiểu. – itachi

+0

Tôi nghĩ rằng mặc dù nó không được chấp nhận, '$ HTTP_POST_VARS' vẫn hoạt động. Nó không phải superglobal, vì vậy có lẽ bạn cần phải làm 'global $ HTTP_POST_VARS;' hoặc truy cập '$ GLOBALS ['HTTP_POST_VARS'];'? –

Trả lời

18

Bạn có thể làm

config.php này

$HTTP_POST_VARS = &$_POST; 
$HTTP_GET_VARS = &$_GET; 
$HTTP_COOKIE_VARS = &$_COOKIE; 

.htaccess

php_value auto_prepend_file /path/to/config.php 

PHP doc auto_prepend_file string

Chỉ định tên của một tập tin được tự động phân tích cú pháp trước ma trong tập tin.Tệp được bao gồm như thể nó được gọi với hàm require, do đó include_path được sử dụng.

Giá trị đặc biệt không vô hiệu hóa tính năng tự động thêm trước.

EDIT: Để có thêm kỹ lưỡng, đó là những superglobals khác mà cũng có thể được aliased:

$HTTP_SERVER_VARS = &$_SERVER; 
$HTTP_POST_FILES = &$_FILES; 
$HTTP_SESSION_VARS = &$_SESSION; 
$HTTP_ENV_VARS = &$_ENV; 
+3

đây là những gì tôi đang tìm kiếm với công cụ runkit đó. –

2

Làm thế nào về một cái gì đó giống như

$HTTP_POST_VARS = $_POST; 

Nếu bạn có thể bao gồm các mã trong các trang, nên hoạt động. Tất nhiên bạn phải có quyền truy cập vào mã nguồn và biên dịch lại exe trong các cửa sổ, nhưng bạn nói có thể.

+1

Đó sẽ là giải pháp trong trường hợp các tệp PHP được lưu trữ trong thư mục của chương trình và không được biên dịch trong tệp thực thi –

0

Có vẻ như những điều sau có thể hoạt động.

Đầu tiên, tạo một edisplaypatch.php đâu đó với mã sau đây

<?php 

if (getenv('EDISPLAY_PATCH')) { 
    if (!isset($HTTP_GET_VARS)) $HTTP_GET_VARS = $_GET; 
    if (!isset($HTTP_POST_VARS)) $HTTP_POST_VARS = $_POST; 
    if (!isset($HTTP_COOKIE_VARS)) $HTTP_COOKIE_VARS = $_COOKIE; 
} 

?> 

Mã này có thể được khái quát hóa và tái sử dụng với bất kỳ chương trình khác đòi hỏi phải có các mảng dài cũ

Sau đó, trong cấu hình vhost Apache thêm

SetEnv EDISPLAY_PATCH true 

Tải lại Apache.

mã kiểm tra hoạt động: nếu setenv là không có mặt không hiển thị gì cả, nếu có thấy những gì bạn gửi đi như rnd tham số trong chuỗi truy vấn

<?php 
echo $HTTP_GET_VARS['rnd']; 
//phpinfo(); 
?> 

ít nhược điểm: Tôi bao gồm một tập tin trên MỌI PHP yêu cầu