2010-09-01 39 views
9

Tôi đang sử dụng Khung công tác Zend và tôi sử dụng .htaccess cho một số cài đặt. Tôi hiện đang viết kịch bản dòng lệnh để lên lịch (ví dụ: cron). Kịch bản dòng lệnh không xem tệp .htaccess vì chúng không được Apache phân phối. Tôi muốn phân tích cú pháp .htaccess bằng tập lệnh của tôi để truy xuất một số cài đặt. Dưới đây là những dòng tôi đặc biệt quan tâm:Phân tích cú pháp tệp .htaccess Với PHP

SetEnv APPLICATION_ENV development 

php_value date.timezone America/New_York 

tôi nhận thấy gói PEAR File_HtAccess, nhưng nó dường như chỉ giải quyết phần xác thực của file .htaccess.


SOLUTION: (với tín dụng do Bamieater)

echo báo cáo cho kết xuất debug, loại bỏ từ mã làm việc.

$htaccess = file(realpath(dirname(__FILE__)) . '/.htaccess'); 
echo '<pre>'; 
foreach ($htaccess as $line) { 
    if (preg_match('/^\s*SetEnv\s+APPLICATION_ENV\s+(.*?)\s*$/', trim($line), $matches)) { 
     defined('APPLICATION_ENV') || define('APPLICATION_ENV', $matches[1]); 
     echo APPLICATION_ENV . PHP_EOL; 
    } elseif (preg_match('/^\s*php_(?:admin_)?value\s+date\.timezone\s+(.*?)\s*$/', $line, $matches)) { 
     date_default_timezone_set($matches[1]); 
     echo date_default_timezone_get() . PHP_EOL; 
    } 
} 
echo '</pre>'; 
+1

Hmmm. Các tệp cấu hình của Apache có khá đơn giản để phân tích thủ công không? Mọi thứ đều là 'giá trị tên' và bỏ qua các dòng bắt đầu bằng' # '. –

+0

bạn đang sử dụng linux: ubuntu hoặc windows –

+0

@Pekka - Đúng vậy, nhưng tôi nghĩ có thể có một đoạn mã đã được viết @JapanPro - Đó là Linux. CentOS, tôi tin. – Sonny

Trả lời

5

Đọc tệp .htaccess trên mỗi dòng và sử dụng cụm từ thông dụng để truy cập dữ liệu.

Ví dụ một cái gì đó như thế này:

$line = "php_value date.timezone America/New_York"; 
$pattern = "@^php_value date.timezone (.*)[email protected]"; 

if(preg_match($pattern,$line,$matches)) 
{ 
    print_r($matches); 
} 
+1

Chỉ cần bổ sung: Tôi sẽ sử dụng '/^\ s * php _ (?: admin _)? Giá trị' ..., chỉ cần thêm chút ít sức mạnh. – Wrikken

+0

@Wrikken - Tôi hiểu phần '\ s *', nhưng cái gì '(?: Admin _)?' Hoàn thành? – Sonny

+0

Tìm câu trả lời. Cài đặt 'php_admin_value' đặt cùng giá trị nhưng không thể ghi đè. '?: 'ở đầu của một subpattern ngăn chặn nó phù hợp với từ bị bắt. – Sonny

1

Phân tích .htaccess, mặc dù nó rất dễ dàng để làm, không phải là giải pháp tốt nhất theo ý kiến ​​của tôi.

Biến môi trường có thể được đặt ở các vị trí khác nhau, vì vậy bạn phải kiểm tra tất cả các tệp (ví dụ: cấu hình Apache chính, các tệp .htaccesses khác).

tôi khuyên bạn nên thiết lập biến môi trường riêng biệt cho kịch bản shell của bạn,

export APPLICATION_ENV=staging 

Tôi giữ những thiết lập về tính chất toàn cầu của máy chủ (config apache và .bashrc), do đó tự động tất cả các ứng dụng biết được nơi họ không thay đổi tệp khi triển khai.

+0

Tôi đồng ý với ý kiến ​​của bạn, nhưng trong trường hợp của tôi tôi không có quyền kiểm soát môi trường Apache, cũng như tôi không có quyền truy cập dòng lệnh, vì vậy tệp '.htaccess' này là nơi duy nhất mà biến môi trường này được đặt. Giải pháp của tôi làm việc cho tôi, nhưng có thể không được tối ưu cho người khác. – Sonny

+0

Đồng ý. Tôi giả sử nếu bạn có thể viết kịch bản dòng lệnh, bạn cũng có thể xuất một biến môi trường. – takeshin

1

Câu trả lời trễ nhưng có thể bạn quan tâm (hoặc những người khác tham gia vào chuỗi này).

Tôi đã viết một trình phân tích cú pháp nhỏ .htaccess, trong PHP, cho phép người dùng thao tác tệp dưới dạng ArrayObject.

Bạn có thể kiểm tra dự án here (GitHub).

2

Mượn một chút từ Bamieater, đây là một hàm hoàn chỉnh hơn bạn có thể thả vào phần đầu của tệp công việc cron của bạn để đặt biến môi trường và bao gồm php_prepend_file.

function isCLI() { 
    return (PHP_SAPI == 'cli'); 
} 

function loadEnvironmentFromHtaccess($file) { 
    $line = file_get_contents($file); 

    $pattern = '@SetEnv (?P<env>[^ ]*) (?P<value>[^ \n]*)@'; 
    preg_match_all($pattern, $line, $matches, PREG_SET_ORDER); 
    foreach ($matches as $match) { 
     $_SERVER[$match['env']] = $match['value']; 
    } 

    $pattern = '@php_value auto_prepend_file (?P<value>[^ \n]*)@'; 
    if (preg_match($pattern, $line, $matches)) { 
     require $matches['value']; 
    } 
} 

if (isCLI()) { 
    loadEnvironmentFromHtaccess(dirname(__FILE__).'/../../.htaccess'); 
} 
Các vấn đề liên quan