2008-10-06 25 views
10

Tôi muốn tìm url cơ sở của ứng dụng, vì vậy tôi có thể tự động tham khảo các tệp khác trong cây ứng dụng của mình ...Tôi làm cách nào để tìm url cơ sở của ứng dụng?

Vì vậy, hãy cho tệp config.php trong cơ sở ứng dụng của tôi, nếu tệp trong một thư mục con bao gồm nó, biết những gì để tiền tố một url với.

application/config.php 
application/admin/something.php 
application/css/style.css 

Vì vậy, cho rằng http://www.example.com/application/admin/something.php được truy cập, tôi muốn nó có thể biết rằng file css là trong $approot/css/style.css. Trong trường hợp này, $approot là "/application" nhưng tôi muốn nó biết nếu ứng dụng được cài đặt ở nơi khác.

Tôi không chắc chắn nếu có thể, nhiều ứng dụng (phpMyAdmin, Squirrelmail tôi nghĩ) phải đặt biến cấu hình để bắt đầu. Nó sẽ thân thiện với người dùng hơn nếu nó chỉ biết.

Trả lời

15

Tôi sử dụng những điều sau đây trong một khung homebrew ... Đặt tệp này vào một tệp trong thư mục gốc của ứng dụng của bạn và chỉ cần bao gồm nó.

define('ABSPATH', str_replace('\\', '/', dirname(__FILE__)) . '/'); 

$tempPath1 = explode('/', str_replace('\\', '/', dirname($_SERVER['SCRIPT_FILENAME']))); 
$tempPath2 = explode('/', substr(ABSPATH, 0, -1)); 
$tempPath3 = explode('/', str_replace('\\', '/', dirname($_SERVER['PHP_SELF']))); 

for ($i = count($tempPath2); $i < count($tempPath1); $i++) 
    array_pop ($tempPath3); 

$urladdr = $_SERVER['HTTP_HOST'] . implode('/', $tempPath3); 

if ($urladdr{strlen($urladdr) - 1}== '/') 
    define('URLADDR', 'http://' . $urladdr); 
else 
    define('URLADDR', 'http://' . $urladdr . '/'); 

unset($tempPath1, $tempPath2, $tempPath3, $urladdr); 

Mã trên xác định hai hằng số. ABSPATH chứa đường dẫn tuyệt đối tới gốc của ứng dụng (hệ thống tệp cục bộ) trong khi URLADDR chứa URL đủ điều kiện của ứng dụng. Nó hoạt động trong các tình huống mod_rewrite.

+0

Chà, điều đó dường như hiệu quả. – DGM

+0

Không, không. Nó trả về đường dẫn hệ thống tập tin vật lý chứ không phải đường dẫn URL. – Gumbo

+0

ABSPATH trả về đường dẫn hệ thống tệp vật lý, URLADDR trả lại URL đủ điều kiện của ứng dụng. –

1

Trừ khi bạn tự theo dõi điều này, tôi không tin rằng điều này sẽ có định nghĩa. Hay đúng hơn, bạn đang yêu cầu PHP theo dõi một cái gì đó mà bạn phần nào tự định nghĩa.

Dài và ngắn của nó là, nếu tôi hiểu câu hỏi của bạn một cách chính xác, tôi không tin những gì bạn đang yêu cầu tồn tại, ít nhất không phải là "cốt lõi" PHP; một khuôn khổ nhất định có thể cung cấp URL "gốc" liên quan đến cấu trúc thư mục mà hiểu.

Điều đó có hợp lý không?

2

Các REQUEST_URI kết hợp với dirname() thể cho bạn biết thư mục hiện tại của bạn, liên quan đến đường dẫn URL:

<?php 
    echo dirname($_SERVER["REQUEST_URI"]); 
?> 

Vì vậy http://example.com/test/test.php in "/ test" hoặc http://example.com/ in "/" mà bạn có thể sử dụng để tạo ra các liên kết đến tham khảo các trang khác liên quan đến đường dẫn hiện tại.

CHỈNH SỬA: chỉ được thực hiện khi đọc lại mà bạn có thể hỏi về đường dẫn trên đĩa thay vì đường dẫn URL. Trong trường hợp đó, bạn muốn getcwd() chức năng của PHP thay vì:

<?php 
    echo getcwd(); 
?> 
1

Đặt này trong config.php của bạn (đó là trong thư mục gốc của ứng dụng của bạn):

$approot = substr(dirname(__FILE__),strlen($_SERVER['DOCUMENT_ROOT'])); 

Tôi nghĩ rằng tôi sẽ làm điều đó.

+0

Đó là gần, nhưng không hoàn toàn. Tôi nghĩ rằng điều này sẽ bị sai lầm do bí danh của máy chủ. – DGM

+0

+1 cho phép toán thú vị. :) – DGM

+0

Ah, đó là sự thật. Tôi đoán cho dù điều này hoạt động phụ thuộc vào cấu hình máy chủ của bạn. –

0

Một giải pháp sẽ là sử dụng đường dẫn tương đối cho mọi thứ, theo cách đó không quan trọng vị trí ứng dụng được cài đặt. Ví dụ, để có được tấm phong cách của bạn, sử dụng này:

../css/style.css 
+2

Vấn đề ở đây là trong một mẫu, nhưng có khả năng được gọi từ các cấp độ khác nhau, vì vậy tôi cần phải biết mức độ nào để gọi dựa trên tập lệnh, nếu không tôi cần url đầy đủ – DGM

0

Nếu bạn muốn các đường dẫn trên hệ thống tập tin mà bạn có thể sử dụng $_SERVER['DOCUMENT_ROOT']
Nếu bạn chỉ muốn đường dẫn của tập tin đó xuất hiện trong URL sau sử dụng tên miền $_SERVER['REQUEST_URI']

0

Tôi chưa bao giờ tìm được cách để làm điều đó.

Tôi luôn thiết lập biến cấu hình với đường dẫn máy chủ đến một cấp trên gốc web.Sau đó, nó là:

  • $ configVar. 'công khai/bất cứ điều gì /' cho nội dung bên trong thư mục gốc,
  • nhưng bạn cũng có thể bao gồm từ bên ngoài với $ configVar. 'PhpInc/db.inc.php /' vv
0

này hoạt động như một say mê đối với tôi, bất cứ nơi nào tôi triển khai, có hoặc không viết lại quy tắc:

$ basedir = 'http: //'. $ _SERVER ['HTTP_HOST']. (Dirname ($ _ SERVER ['SCRIPT_NAME'])! = '/'? Dirname ($ _ SERVER ["SCRIPT_NAME"]). '/': '/');

+1

Điều này đến gần, nhưng nó không cạo tắt các thư mục con của ứng dụng từ url. Vì vậy, nếu tôi ở http: //hostname/application/subfolder/test.php và bao gồm một tệp trong/ứng dụng định nghĩa biến này, nó vẫn có thư mục con trong url.Tôi chỉ muốn/ứng dụng – DGM

+0

Thử viết lại URL. Chỉ cần viết lại mọi thứ cho một index.php trong/application/(ngoại trừ một số nguồn tài nguyên http) Làm cho index.php đó chuyển tiếp nó tới thư mục con chính xác. – SchizoDuckie

+0

Enable mod_rewrite trong apache .htaccess trong/application/ RewriteEngine On RewriteRule^includes/- [L] [OR] #do không áp dụng cho/bao gồm HOẶC RewriteRule^images/- [L] #do không áp dụng cho/hình ảnh RewriteRule ^. * index.php #rewrite mọi thứ vào index.php Phân tích $ _SERVER ['REQUEST_URI'] cho đường dẫn của bạn! – SchizoDuckie

1

gốc url của ứng dụng có thể được tìm thấy bằng

$protocol = (strstr('https',$_SERVER['SERVER_PROTOCOL']) === false)?'http':'https'; 
$url = $protocol.'://'.$_SERVER['SERVER_NAME'].dirname($_SERVER['REQUEST_URI']); 

mã này sẽ trở lại con đường url của bất kỳ ứng dụng cho dù là trực tuyến hoặc trên máy chủ trực tuyến.

Tôi chưa thực hiện kiểm tra thích hợp cho '/' thích hợp. Vui lòng sửa đổi nó cho dấu gạch chéo.

tệp này phải được đặt trong thư mục gốc.

dụ: url nếu ứng dụng:

http://localhost/test/test/test.php 

sau đó mã này sẽ trở lại

http://localhost/test/test 

Cảm ơn

5

Bạn có thể tìm thấy những địa chỉ cơ sở với mã folowing:

define('SITE_BASE_PATH','http://'.preg_replace('/[^a-zA-Z0-9]/i','',$_SERVER['HTTP_HOST']).'/'.str_replace('\\','/',substr(dirname(__FILE__),strlen($_SERVER['DOCUMENT_ROOT']))).'/'); 

Ngắn và tốt nhất.

+0

Tôi sẽ đề xuất bao gồm một chút "." sau đó ".... 0-9" nếu bạn muốn nó hoạt động trên địa chỉ ip. ----> 'define ('SITE_BASE_PATH', 'http: //'.preg_replace ('/[^ a-zA-Z0-9.]/i ',' ', $ _ SERVER [' HTTP_HOST ']). '/'.str_replace('\\''''',substr(dirname(__FILE__),strlen($_SERVER['DOCUMENT_ROOT']))).'/'); ' –

+0

Tại sao' str_replace ("\\" '?? – TCB13

0

Đây là những gì tôi đã sử dụng trong ứng dụng của tôi hoạt động tốt, tôi cũng sử dụng một cổng tùy chỉnh vì vậy tôi đã phải cho phép điều này cũng.

define('DOC_URL', ($_SERVER['HTTPS']=='on'?'https':'http').'://'.$_SERVER['SERVER_NAME'].(!in_array($_SERVER['SERVER_PORT'], array(80,443))?':'.$_SERVER['SERVER_PORT']:'')).dirname($_SERVER['REQUEST_URI']); 

Sau đó, tôi sử dụng nó bằng cách gõ như sau ...

<img src="<?php echo DOC_URL; ?>/_img/logo.png" /> 
Các vấn đề liên quan