Nasıl ben "uygulama kökü" alabilirsiniz

5 Cevap

Benim URL http://www.server.com/myapp/stuff/to/see ve diskte benim dizin yapısı ise htdocs/myapp/*, nasıl /myapp kısmını ayıklamak? Ayrıca, orada ne herhangi bir uygulama klasörü ve uygulama kök sadece '/' olsaydı? Bu değeri almak için, önceden tanımlanmış bir değişken var mı?

Ne istiyorum ben sadece /stuff/to/see ile sol kulüpler, böylece /myapp istek URI keserek mümkün olan bir işlevdir. VE, ben de bu belirlemek var, sunucunun belge kök uygulama taşımak için olsaydı (ki /stuff/to/see gibi döndürülür /stuff/to/see)

Benim dizin yapısı şudur:

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

Yani, index.php den, ben yukarıda ne sordu almak için nasıl bilmek istiyorum.

5 Cevap

Için çeşitli yanıtlar da belirttiği gibi web root, DOCUMENT_ROOT var. Için application root, kök klasör uygulamanızda hangi klasörde söylemek sistem için hiçbir yolu yoktur. Elle bu ayarlamanız gerekir.

Çoğu uygulama dirname(__FILE__); kullanan bir uygulama kökü veya bir yapılandırma ayarı tanımlamak ve uygulama genelinde geçerli bir sabiti bu saklayın.

Eğer http://www.server.com/myapp/stuff/to/see kullanarak bir sayfaya erişmek, ve web sunucusu belge kök /something/htdocs/ olduğu zaman, o anki local yolunu /something/htdocs/myapp/stuff/to/see.

Almalısınız net bir tanımı which yol var çünkü şimdi /something/htdocs/myapp/ bir sonucu olarak elde etmek için kesin bir çözüm yoktur. Bunun için bazı kural varsa, bize söyleyin, biz bir şey ile gelmek mümkün olabilir, ama hesaplama olmadan görebilirsiniz Sadece yolları şunlardır:

  • 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'] and $_SERVER['PHP_SELF']
<?php
define('ABSPATH', dirname(__FILE__));

Uygulamanızın kök klasöründe bulunan bir dosyaya aşağıdaki kodu koyun ve her sayfa yük üzerinde bulunmaktadır.

Daha sonra, sadece her zaman $path = ABSPATH . '/path/to/file.php'; olursa olsun, yerel kopyası bir alt dizine folder veya değil eğer yapabilirsiniz.


Uygulama zaten her sayfa yük üzerinde bulunan bir dosya varsa, sadece bu dosyada yukarıdaki kodunu bırakın ve bu iş olacak.

Sadece ek eklemek zorunda olabileceğini unutmayın dirname() Bu dosya bulunduğu yere bağlı olarak çağırır. Eğer webapp kökünden geçmek her dizin için bir tane ekleyin.

: Da webapp /webapp/ bulunan ve "küresel içerir" Örneğin, /webapp/includes/framework/init.php, daha sonra yukarıda kod gibi modifiye edilmesi gerekmektedir bulunur

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

yani:. 2 ek dirname() webapp kökünden nedeniyle iki ek klasörler çağırır (includes/framework)


Clarification

Yukarıdaki kod tek bir dosyada olması gerekiyordu, ve web uygulama yalnızca bir dosyadır. Bu dosya her sayfada yükü dahil edilmesi gerekiyor.

Zaten (Böyle bir yapılandırma dosyası ya da diğer) herhangi bir işlem önce dahil bir dosya varsa, bu dosyada bu kodu kopyalayıp yapıştırabilirsiniz.

The number of dirname() calls depends on how deep the file you copied and pasted the code in is relative to the root directory of your web application. For the examples above, assume the root of your web application is represented by ~.

Eğer ~/abspath.php içine benim kodu kopyalayıp yapıştırın, o zaman bir dirname() çağrıyı gerekir.

Eğer ~/includes/abspath.php içine benim kodu kopyalayıp yapıştırın, daha sonra iki dirname() aramaları gerekir.

Eğer ~/includes/config/abspath.php, o zaman gereken üç dirname() aramaların içine benim kodu kopyalayıp yapıştırın. Şimdi sadece bu nihai konumu diyelim.

~/index.php, aşağıdaki misiniz:

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

ve ABSPATH erişebilirsiniz.

~/dir/someOtherPage.php aşağıdaki misiniz:

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

ve ABSPATH erişebilirsiniz.

Ben zaten her sayfada yükü bulunan bir dosya varsa, onun basit sadece yukarıdaki kodu damla söylüyorum nedeni budur. Sadece dirname() buna göre çağırır miktarını değiştirmek emin olun. Yine, bu kod sadece bir dosya olması içindir.


Sonra URL yolunu alabilirim, DAN DOCUMENT_ROOT kaldırarak onun basit bir mesele ABSPATH:

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

Bu deneyin:

 echo dirname(__FILE__);

__FILE__ Geçerli betiğin adıdır, ve dirname bunun dışında klasör / uygulama klasörünü alır burada.

More Options:

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

On PHP.net

$_SERVER['DOCUMENT_ROOT'] size htdocs yolunu verecek, sonra oradan gidebilirsiniz

EDIT

$_SERVER['REQUEST_URI'] olursa olsun her zaman disk veya hangi çağrılır dosyasından dosyaların konumu, yukarıdaki örnek url /myapp/stuff/to/see verecektir.

bu yüzden explode ing sadece bir zaman meselesi, array_shift ing, ve implode Ing.

Eğer bir çerçeve kullanarak konum gibi btw, dizin yapısı, görünüyor. Bazı çerçeveler yararlı bulabileceğiniz bir URI / URL kitaplığı var (en azından CodeIgniter vardır, diğer çerçeveler ile% 100 emin değilim)