2009-03-12 18 views
6

Tôi đang chạy nhiều ứng dụng PHP trên máy Mac, chạy OS X 10.5.6, Apache 2, PHP 5. Tôi có thiết lập tên miền phụ cho từng dự án, mục lưu trữ tệp cho từng miền phụ và khối Thư mục ảo trong cấu hình Apache. Vì vậy,Làm cách nào để giới hạn các ứng dụng PHP vào các thư mục của riêng chúng và php.ini của riêng chúng?

project1.localhost đi vào/Library/WebServer/Documents/Project1
project2.localhost đi vào/Library/WebServer/Documents/project2
vv ...

Tuy nhiên, phương pháp này không thực sự "cô lập" các ứng dụng web. Ví dụ: nếu tôi bao gồm một tập lệnh như vậy:

<?php 
include("/includes/include.php"); 
?> 

Nó tham chiếu tập lệnh từ thư mục cơ sở của máy tính của tôi. Vì vậy, nó truy cập
C: /includes/include.php

Có cách nào cho tôi để làm cho nó tham khảo
C: /Library/WebServer/Documents/Project2/includes/include.php

Về cơ bản , làm cho nó để nó không nhận thức được bất cứ điều gì bên ngoài thư mục riêng của nó. Ngoài ra, có cách nào để sử dụng php.ini trên một cơ sở cho mỗi tên miền phụ?

Trả lời

8

Tôi tin rằng có thể đặt php.ini cho mỗi máy chủ ảo

<VirtualHost *:80> 
    ... 

    PHPINIDir /full/path/to/php/ini/ 

</VirtualHost> 

cách này bạn có thể tùy chỉnh open_basedir và những người khác

+0

Ý bạn là gì theo "cách này bạn có thể tùy chỉnh open_basedir và những người khác". Open_basedir có phải là thiết lập INI không? –

+1

có, và đó là lý do tại sao sử dụng 'php_admin_value open_basedir "/ path"' cũng hoạt động –

-1

Hãy thử đường dẫn tương đối! Giống như:

<?php 
include("./includes/include.php"); 
?> 

hoặc

<?php 
include("includes/include.php"); 
?> 
+0

Vì vậy, các dấu chấm làm cho nó đi đến tiểu lĩnh vực DocumentRoot? –

+0

Còn php.ini thì sao? –

+0

"." luôn là thư mục hiện tại! –

0

Nếu bạn muốn sử dụng tên đường dẫn đầy đủ, bạn có thể sử dụng:

<?php 
include dirname(__FILE__) . '/includes/include.php'; 
?> 

Possible solution for php.ini file

+0

Theo tài liệu PHP "Nếu được sử dụng bên trong bao gồm, tên của tệp được bao gồm sẽ được trả về". Vì vậy, đó không phải là hữu ích hoặc, trong trường hợp một bao gồm các tập tin khác. –

4

Bạn có thể giới hạn một kịch bản khả năng nhìn thấy bất cứ điều gì ở trên một cây thư mục cụ thể bằng cách thêm chỉ thị open_basedir một khối thư mục trong tệp httpd.conf. Nó sẽ giống như thế:

< DIRECTORY/full/path/to/thư mục/chứa/script/>

php_admin_value open_basedir "/ full/path/to/top/thư mục/của/mong muốn/cây /"

</MỤC >

một điều - nếu bạn không kết thúc con đường với một/thì đó là một trận đấu wildcard. Nói cách khác, "/ var/etc/my" sẽ khớp với "/ var/etc/myFolder" cũng như "/ var/etc/myMothersFolder", trong khi "/ var/etc/my /" sẽ chỉ khớp với thư mục chính xác đó Tên.

+0

Tôi chưa từng thử làm điều này, nhưng có bất kỳ cảnh báo nào khi sử dụng phương pháp này không? –

+0

Hãy cẩn thận? Như thế nào? Với chỉ thị open_basedir hoặc đặt chỉ thị trong tệp httpd.conf? – user13414

+0

Tôi đã không tìm thấy bất kỳ gotchas mà không được đề cập một cách rõ ràng trong các tài liệu. – user13414

1

Về cách ly ứng dụng ~ này có liên quan đến việc bảo mật các tập lệnh PHP để chúng không thể truy cập vào các tập lệnh khác không? Vui lòng giải thích -

Về php.ini - Tôi không biết cách sử dụng một php.ini cụ thể cho mỗi thư mục, nhưng bạn chắc chắn có thể tạo một trang php bao gồm một loạt các dòng ini_set(), có thể giống như điều này ..

<?php 
    // in your header or along top of all php modules in your pap 
    require_once ('/path/to/includes/ini_set.php'); 

    // ... 

?> 

và kịch bản ini_set.php:

<?php 
    // one of these for each override of defaults set in php.ini file -- 
    ini_set ($varname, $newvalue); 
    ini_set ($varname, $newvalue); 
    ini_set ($varname, $newvalue); 
?> 

Nếu bạn muốn tìm hiểu thêm về ini_set() chức năng, đây là trang tài liệu trên php.net: http://us3.php.net/ini_set

Hy vọng điều này có phần hữu ích ~

+0

Tôi đã suy nghĩ về làm việc trên nhiều ứng dụng cùng một lúc và không sử dụng cùng một INI cho tất cả chúng. Tôi cũng muốn có thể dễ dàng di chuyển các ứng dụng sang Linux hoặc Windows mà không cần phải tạo lại toàn bộ cấu trúc thư mục vì tôi có các đường dẫn tuyệt đối trong chúng. –

+0

Có vấn đề về hiệu suất nào với cài đặt giá trị PHP INI trên mỗi lần tải trang không? –

1

Cách tốt nhất để làm điều đó là sử dụng PHP qua FCGI (mod_fcgid). Bằng cách này bạn có thể chạy PHP bằng cách sử dụng một người dùng khác nhau và một php.ini khác nhau trên mỗi máy chủ.

Dưới đây là một ví dụ làm thế nào để thiết lập một cấu hình như trên Ubuntu: http://www.howtoforge.com/how-to-set-up-apache2-with-mod_fcgid-and-php5-on-ubuntu-8.10

+0

Tôi sẽ xem xét điều này nếu tôi không thể tìm thấy phương pháp khác. Cảm ơn! –