2010-02-22 32 views
20

Nếu URL của tôi là http://www.server.com/myapp/stuff/to/see và cấu trúc thư mục của tôi trên đĩa là htdocs/myapp/*, làm cách nào tôi có thể trích xuất phần /myapp? Ngoài ra, nếu không có thư mục ứng dụng và gốc ứng dụng chỉ là '/' thì sao? Có một biến được xác định trước để nhận được giá trị đó không?Làm cách nào để có được "gốc ứng dụng" của URL của tôi từ PHP?

Điều tôi muốn là chức năng có thể cắt /myapp khỏi URI yêu cầu để tôi chỉ còn lại /stuff/to/see. AND, nếu tôi là để di chuyển các ứng dụng vào thư mục gốc tài liệu máy chủ, có nó xác định rằng cũng (để /stuff/to/see chỉ được trả về như /stuff/to/see)

cấu trúc thư mục của tôi là:

application 
    |-config 
    |-config.inc.php 
library 
    |-autoload.class.php 
public 
    |-css 
    |-img 
index.php 

Vì vậy, từ index.php, tôi muốn biết làm thế nào để có được những gì tôi đã hỏi ở trên.

Trả lời

12

Đối gốc web, có DOCUMENT_ROOT như đã chỉ ra trong vài câu trả lời. Đối với ứng dụng gốc ứng dụng, không có cách nào để hệ thống cho biết thư mục nào trong ứng dụng của bạn là thư mục gốc. Bạn sẽ phải đặt thủ công.

Hầu hết các ứng dụng xác định gốc ứng dụng bằng cách sử dụng dirname(__FILE__); hoặc cài đặt cấu hình và lưu trữ trong một hằng số có sẵn trong suốt ứng dụng.

+0

Tôi có cần phải mã hóa nó không ? Không có gì tôi có thể thêm, nói DOC_ROOT/myapp/index.php, mà có thể lập trình con số ra rằng đây là gốc ứng dụng? – scottm

+1

Nếu bạn đang ở /myapp/index.php, 'dirname (__ FILE __)' (= "cho tôi thư mục hiện tại của tệp này") sẽ cung cấp cho bạn gốc ứng dụng cuối cùng.Bạn có thể lưu trữ nó trong một hằng số và sử dụng nó. –

0

Hãy thử điều này:

echo dirname(__FILE__); 

nơi __FILE__ là tên của kịch bản đang thực hiện, và dirname được thư mục thư mục/ứng dụng ra khỏi nó.

More Options:

echo $_SERVER['DOCUMENT_ROOT']; // gives you the root dir 

On PHP.net

1

$_SERVER['DOCUMENT_ROOT'] sẽ cung cấp cho bạn đường dẫn đến thư mục htdocs, sau đó bạn có thể đi từ đó

EDIT

$_SERVER['REQUEST_URI'] sẽ luôn cung cấp cho bạn /myapp/stuff/to/see từ url mẫu của bạn ở trên, bất kể vị trí tệp trên đĩa hoặc từ tệp được yêu cầu.

vì vậy nó chỉ là vấn đề explode ing, array_shift ing và implode ing.

btw, từ cấu trúc thư mục của bạn, có vẻ như bạn đang sử dụng một khung công tác. một số khuôn khổ có một thư viện/URL URI mà bạn có thể thấy hữu ích (ít nhất là CodeIgniter có, không chắc chắn 100% với các khuôn khổ khác)

15

Khi bạn truy cập một trang sử dụng http://www.server.com/myapp/stuff/to/see, và gốc tài liệu của máy chủ web của bạn đang ở /something/htdocs/ thì đường bay local hiện tại là /something/htdocs/myapp/stuff/to/see.

Không có giải pháp xác định nào để nhận được /something/htdocs/myapp/ do đó, vì không có định nghĩa rõ ràng mà đường dẫn bạn sẽ nhận được.Khi bạn có một số quy tắc cho rằng, cho chúng tôi, và chúng tôi có thể có thể đưa ra một cái gì đó, nhưng không có tính toán, những con đường duy nhất mà bạn có thể thấy là:

  • http://www.server.com/myapp/stuff/to/see
    $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']
  • /something/htdocs/myapp/stuff/to/see/index.php
    $_SERVER['SCRIPT_FILENAME']
  • /something/htdocs/
    $_SERVER['DOCUMENT_ROOT']
  • /myapp/stuff/to/see
    $_SERVER['REQUEST_URI']
  • /myapp/stuff/to/see/index.php
    $_SERVER['SCRIPT_NAME']$_SERVER['PHP_SELF']
+0

Bạn có thể làm rõ các biến số bạn đã sử dụng để nhận các giá trị đó không? – scottm

+2

Tạo một tệp thử nghiệm với ''. Sau đó, bạn có được một ý tưởng về những gì bạn có thể nhận được theo cách nào :) Nhưng tôi cũng đã cập nhật bài viết của tôi để bao gồm các biến chính xác. – poke

+0

Chắc chắn sẽ rất tuyệt khi thấy một cái gì đó được xây dựng cho một cái gì đó giống như hàm 'gần nhất()' của jQuery, vì vậy chúng ta có thể lấy đường dẫn của thư mục gần nhất với tập lệnh hiện tại, bằng cách chuyển tên thư mục –

3
<?php 
define('ABSPATH', dirname(__FILE__)); 

Đặt mã sau vào tệp nằm trong thư mục gốc của ứng dụng và bao gồm trong mỗi lần tải trang.

Sau đó, bạn chỉ cần luôn làm $path = ABSPATH . '/path/to/file.php'; bất kể bản sao cục bộ của bạn có nằm trong thư mục con folder hay không.


Nếu ứng dụng của bạn đã có tệp được bao gồm trong mỗi lần tải trang, bạn có thể chỉ cần thả mã ở trên vào tệp đó và nó sẽ hoạt động.

Chỉ cần lưu ý rằng bạn có thể phải bổ sung thêm dirname() cuộc gọi tùy thuộc vào vị trí tệp đó. Thêm một cho mỗi thư mục bạn vượt qua từ gốc của webapp của bạn.

Ví dụ, nếu ứng dụng web của bạn nằm ở /webapp/ và bạn "toàn cầu bao gồm" tọa lạc tại /webapp/includes/framework/init.php, sau đó các mã trên cần phải được sửa đổi như vậy:

define('ABSPATH', dirname(dirname(dirname(__FILE__)))); 

tức .: 2 thêm dirname() cuộc gọi do hai thư mục bổ sung từ gốc webapp (includes/framework)


Làm rõ

Đoạn mã trên có nghĩa là nằm trong một tệp và chỉ một tệp trong ứng dụng web của bạn. Tệp đó cần phải được bao gồm trong mỗi lần tải trang.

Nếu bạn đã có tệp được bao gồm trước bất kỳ quá trình xử lý nào (chẳng hạn như tệp cấu hình hoặc tệp khác), bạn có thể sao chép và dán mã đó vào tệp đó.

Số lượng cuộc gọi dirname() tùy thuộc vào mức độ tệp bạn sao chép và dán mã tương ứng với thư mục gốc của ứng dụng web của bạn. Đối với các ví dụ trên, giả sử gốc của ứng dụng web của bạn được biểu thị bằng ~.

Nếu bạn sao chép-dán mã của mình vào ~/abspath.php, thì bạn cần một cuộc gọi dirname().

Nếu bạn sao chép-dán mã của mình vào ~/includes/abspath.php, thì bạn cần hai cuộc gọi dirname().

Nếu bạn sao chép-dán mã của mình vào ~/includes/config/abspath.php, thì bạn cần ba cuộc gọi dirname(). Bây giờ chúng ta hãy nói đó là vị trí cuối cùng của nó.

Trong ~/index.php, bạn thực hiện như sau:

<?php 
require_once('includes/config/abspath.php'); 

và bạn có quyền truy cập vào ABSPATH.

Trong ~/dir/someOtherPage.php bạn làm như sau:

<?php 
require_once('../includes/config/abspath.php'); 

và bạn có quyền truy cập vào ABSPATH.

Đây là lý do tại sao tôi nói rằng nếu bạn đã có tệp được bao gồm trong mỗi lần tải trang, đơn giản hơn là chỉ cần thả mã ở trên vào đó. Chỉ cần đảm bảo bạn sửa đổi số lượng cuộc gọi dirname() cho phù hợp. Một lần nữa, mã này có nghĩa là chỉ trong MỘT TẬP TIN.


Sau đó làm được những đường dẫn URL, một vấn đề đơn giản của nó loại bỏ các DOCUMENT_ROOT TỪ ABSPATH:

$docRoot = rtrim($_SERVER['DOCUMENT_ROOT'], '/'); 
define('RELADDR', substr(ABSPATH, strlen($docRoot)); 
0

tôi phát sinh một vấn đề tương tự. Về cơ bản, trong PHP nếu một tệp 'A.php' sử dụng đường dẫn tương đối để tham chiếu một tài nguyên, thì vị trí đường dẫn hiện tại được sử dụng làm tiền tố cho đường dẫn tương đối là của php cha mẹ hàng đầu theo đó 'A.php' được bao gồm.

Điều này sẽ không thành vấn đề nếu bản thân A.php là cha mẹ hàng đầu hoặc khi A.php ngồi ở cùng một thư mục với tư cách là cha mẹ hàng đầu của nó. Nhưng nó sẽ phá vỡ nhập khẩu nếu không.

Giải pháp tốt nhất tôi thấy là làm cho tham chiếu tuyệt đối bằng cách sử dụng DIR (cung cấp vị trí hiện tại của tệp) và sau đó chuyển đến từ vị trí này cho ví dụ: DIR. "/../ help.php" để tham khảo một tệp help.php ngồi 1 cấp trên A.php.

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