2012-10-14 4 views
9

(Vorbemerkung: Es gibt scheinbar viele Varianten dieser Frage bereits hier, aber alle scheinen sich auf den Speicherort der physischen PHP-Dateien selbst zu konzentrieren ., nicht die Web URL Lage der Dinge, das ist, was ich nach)


INTRO 1:

ich habe eine kleine "Website" mit dem folgenden physikalischen fil eSystem Struktur:

variable.php 
folder 
    test.php 

(Mit anderen Worten, variable.php in der obersten Ebene, und test.php im Ordner folder.)

Hier sind die Dateiinhalte:

<?php 
//variable.php 
$basePath = dirname($_SERVER['SCRIPT_NAME']); 
?> 

<?php 
//test.php 
include("../variables.php"); 
echo $basePath; 
?> 

INTRO 2:

Wenn diese "Website" vor Ort zu entwickeln, ist es unter dieser Adresse:

http://localhost/~noob/test-website 

FRAGE:

Das Problem ist, dass wenn ich http://localhost/~noob/test-website/folder/test.php in meinem Browser setzen, es ausdruckt /~noob/test-website/folder/.

Ich möchte es ausdrucken /~noob/test-website (die "web location" von variable.php). Mit anderen Worten, ich möchte globalen Zugriff von allen Dateien haben, noch tiefer in der Dateisystemhierarchie, bis /~noob/test-website. Wie erreiche ich das?

Ich möchte diesen Pfad natürlich nicht fest codieren. Der Grund ist, dass wenn ich ihn auf einen Produktionsserver hochlade, der Standort in etwas vernünftigeres wie http://example.com/ geändert wird (und ich möchte das hardcoded nicht ändern müssen) Pfad nach dem Hochladen auf den Server, daher diese Frage natürlich).

+0

Sie diese Dateien für einschließlich tun, oder etwas anderes? –

+0

@ZachRattner ich dies tue (möglicherweise unter anderem) beziehen Sie sich auf CSS-Dateien innerhalb meiner HTML-Datei les. Das Navigieren mit ".." funktioniert nicht so gut, wenn Sie zum Umschreiben von URLs mod_rewrite verwenden. Das neigt dazu, den Standardmechanismus zu glauben, dass Sie sich in einem Ordner befinden, der nicht wirklich existiert (da mod_rewrite gefälschte "Ordner" erstellen kann). Ein globaler "Basis" -Pfad löst dieses Problem. Das einzige Problem ist, dass es derzeit hart codiert ist. Ich möchte diesen lästigen hartcodierten Pfad entfernen und allgemein machen. – NoobOverflow

+0

@NoobOverflow Ich habe Ihre Prämie bemerkt; Meins und Leighs Antwort sind leicht unterschiedliche Ansätze für dasselbe Ziel. Wenn Leighs Antwort für dich funktioniert dann toll, aber ansonsten poste bitte die in meinem Kommentar genannten Werte auf meine Antwort und ich werde mich entsprechend anpassen. – cmbuckley

Antwort

4

Das Problem hier ist, dass Ihr Webserver (und damit PHP) nicht weiß, dass Ihr Test-Stammverzeichnis aus einem Unterverzeichnis bedient wird, und in der Tat keiner von beiden interessiert.

Die naheliegende Lösung wäre, ein Konfigurationsskript auf jedem Server bereitzustellen, das den fest codierten relativen Stamm darin hat. Wie Sie bereits gesagt haben, wollen Sie das nicht tun. (Es ist nicht wirklich schlecht, serverspezifische Konfigurationsdateien bereitzustellen, viele Leute tun viel absurdere Dinge)

Um dies zu umgehen, muss eine Lösung von den Referenzpunkten abhängen, die verfügbar sind es für eine spezifische Anfrage. Diese Bezugspunkte sind:

  • Das Dateisystem Standort von variables.php
  • Das Dateisystem Position des Skripts angefordert wird.
  • Die Position im Dateisystem, das die Wurzel ist, die Seiten von

serviert werden (ich weiß, du Dateisystem betont habe nicht - lesen Sie weiter, verwenden wir diese Ihren Wert zu erhalten)

Mit diesen In der Verzeichnisstruktur wird es zu Überschneidungen kommen. Dies ist der Wert, nach dem Sie suchen.

Beispiel:

  • Ihre Test-Site unter: http://localhost/c/
  • Anfrage: http://localhost/c/d/myscript.php
  • variables.php ist: /a/b/c/variables.php
  • myscript.php unter: /c/d/myscript.php umfasst ../variables .php

Wie Sie sehen können, überschneiden sich die Pfade durch die /c/ Verzeichnis.

In Ihrem variables.php können Sie den folgenden Code verwenden, um diese Überlappung zu berechnen.

$fsRoot = __DIR__; // dirname(__FILE__) for PHP < 5.3 (and shame on you!) 
$webRoot = str_replace($_SERVER['PHP_SELF'], '', $_SERVER['SCRIPT_FILENAME']); 
$urlRoot = str_replace($webRoot, '', $fsRoot); 

Sie sollten sich nicht auf DOCUMENT_ROOT verlassen es sehr leicht falsch sein kann, so dass es wir Berechnung ourself ($webRoot Variable).

Dies nimmt das Dateisystem Verzeichnis von variables.php der in Ihrem Site-Stamm ist, und entfernt die das Dateisystem Verzeichnis, das die Basis ist, die Seiten aus bedient werden. Was übrig bleibt, ist alles, was zwischen dem eigentlichen Webstamm und dem Unterverzeichnis web root war.

In myscript.php können Sie Folgendes tun.

print $urlRoot . '/filename.js'; 

Die Ausgabe aus dem Beispiel würde /c/filename.js

3

Hoffentlich wird dies nahe kommen (alles in variables.php sein soll):

// folder containing the requested script 
$requested = dirname($_SERVER['SCRIPT_FILENAME']); 

// folder containing variables.php 
$current = dirname(__FILE__); 

// relative path from variables.php to the requested script 
$relative = str_replace($current, '', $requested); 

// remove relative path from end of script name 
$pattern = '#' . preg_quote($relative) . '$#'; 
$basePath = preg_replace($pattern, '', dirname($_SERVER['SCRIPT_NAME'])); 

Hinweis: Das sieht aus wie es für Ihr spezielles Beispiel funktionieren, aber dies bedeutet, dass variables.php muss immer in einem Ordner entweder unter oder als übergeordnetes Element von DOCUMENT_ROOT, andernfalls kann der relative Pfad nicht anhand des oben genannten ermittelt werden.

+0

Das hat nicht funktioniert, $ basePath endete genau so wie in meiner Frage. – NoobOverflow

+0

Wenn aus irgendeinem Grund '$ pattern' nicht übereinstimmt, dann fällt es auf dasselbe wie das, was Sie ursprünglich hatten; Wie wäre es, wenn Sie uns die Ausgabe von 'var_dump ($ current, $ requested, $ relativ, $ pattern) zeigen;' damit wir Ihr Szenario debuggen können. – cmbuckley

1

Ich bin nicht sicher, es wird Ihr Problem lösen für immer oder nicht, aber es funktioniert in Ihrem Beispiel:

$x = explode("/", $_SERVER['SCRIPT_NAME']); 
echo $_SERVER['SERVER_NAME'] . '/' . $x[1] . '/'; 

Wenn Sie die Ausgabe möchten, können passen Sie es an Ihre Bedürfnisse anzupassen.:)

-1

Ich denke sein, ich ist die docroot (Form außerhalb) suchen - es kann in $_SERVER['DOCUMENT_ROOT'] (im Dateisystem) zu finden & mit __DIR__ vergleichen (oder dirname(__FILE__) für frühere PHP)

0

ich in einem Projekt gearbeitet, wo es war necesary ein Verzeichnis mit vielen Bildern, mit Ordnern innerhalb, und es war erforderlich, um alle Dateien in einer rekursiven Weise zu lesen ...

Funktion:

function ListIn($dir, $prefix = '') { 
    $dir = rtrim($dir, '\\/'); 
    $result = array(); 

    foreach (scandir($dir) as $f) { 

     if ($f !== '.' and $f !== '..') { 

      if (is_dir("$dir/$f")) { 
       $result = array_merge($result, ListIn("$dir/$f", "$prefix$f/")); 
      } 
      else { 
       $ext = substr($prefix.$f, strrpos($prefix.$f, '.') + 1); 

       if(in_array($ext, array("jpg"))){ 
        // echo $prefix.$f."<br>"; 
        $result[] = $prefix.$f; 
       } 


      } 

     } 

    } 

    return $result; 
} 

Weise des Gebrauches:

$path='images/mytest'; 

$images = (ListIn($path)); 

foreach($images as $image){ 
     $image=explode("/",$image); 
     echo $image=$image[2]; 
} 

Wie Sie sehen können, wird jedes einzelne Bild ein Array, und Sie können, um die ersten Elemente des Arrays zugreifen um das gewünschte Verzeichnis zu extrahieren ... In diesem Fall befand es sich am zweiten Index des Arrays, abhängig von der Tiefe Ihrer Dateistruktur ...

Ich hoffe, das ist thi s kann dir helfen!

-1

Mit dieser Funktion: -

#This function will return the current script name 
function get_script_name() 
{ 
    $uri_array = explode('/',$_SERVER['SCRIPT_NAME']); 
    $script_name = end($uri_array); 
    return $script_name; 
} 
#call The function 
$script_name = get_script_name(); 
echo $script_name; 
+1

Diese Funktion gibt nur den Namen der aktuellen Skriptdatei zurück – Nitin

1

Es ist nicht ganz narrensicher, aber die Lösung von Kurogo funktioniert in den meisten Fällen verwendet.

https://github.com/modolabs/Kurogo-Mobile-Web/blob/release-1.5/lib/Kurogo.php#L797

Es vergleicht im Grunde die REQUEST_URI und die DOCUMENT_ROOT, und hält das Hinzufügen von Ordnern aus dem REQUEST_URI zum DOCUMENT_ROOT bis es eine Übereinstimmung wird. Sobald es WEBROOT_DIR findet (was in Ihrem Fall wahrscheinlich ein dirname(__FILE__) aus der Variablen.php wäre), indem es von DOCUMENT_ROOT aufbaut, speichert es den vorhandenen Pfad als Ihre $ urlBase.

Dies funktioniert nur für Unterordner/Symlinks, und behandelt nicht Dinge wie Apache Aliasing, so dass es nicht speziell für Ihren Fall funktioniert, aber es ist zumindest ein Teil der Antwort.

0

ich offensichtlich nicht will, diesen Weg zu codieren. Der Grund dafür ist, dass , wenn ich es auf einen Produktionsserver hochzuladen, haben die Lage Änderungen an etwas mehr gesund wie http://example.com/ (und ich will nicht diesen hardcoded Pfad nach dem Hochladen auf den Server zu ändern, daher diese Frage natürlich).

Sie können Pfade hart codieren, machen Sie es nur relativ zur Homepage.

Zum Beispiel sind http://localhost/~noob/test-website/ und http://example.com die gleiche Sache. Also sorge dich nur um Dinge darunter.

0

(Vorbemerkung: Es gibt scheinbar viele Varianten dieser Frage bereits hier, aber sie alle scheinen sich auf den Dateisystem-Speicherort der physischen PHP-Dateien selbst zu konzentrieren, nicht die Web-URL-Position der Dinge, was ich bin nach.)

[HR] [/ HR] INTRO 1:

Ich habe eine kleine "Website" mit der folgenden physikalischen Dateisystemstruktur:

variable.phpfolder test.php (Mit anderen Worten, variabel. . php in der obersten Ebene, und test.php im Ordner Ordner) Hier sind die Dateiinhalte:

[HR] [/ HR] INTRO 2:

Wenn diese "Website" Entwicklung vor Ort, Es ist unter dieser Adresse:

http: // localhost/~ Noob/Test-Webseite [HR] [/ HR] FRAGE:

Das Problem ist, dass, wenn ich setzen

localhost/~ Noob/Test-Webseite/Ordner/test.php in meinen Browser, es druckt/~ noob/test-website/ordner/aus.

Ich möchte, dass/~ noob/test-website (der "web location" von variable.php) ausgedruckt wird. Mit anderen Worten, ich möchte globalen Zugriff von allen Dateien, auch die tiefer in der Dateisystemhierarchie, auf/~ noob/test-website haben. Wie erreiche ich das?

Ich möchte diesen Pfad natürlich nicht fest codieren. Der Grund ist, dass wenn ich ihn auf einen Produktionsserver hochlade, der Standort in etwas vernünftigeres wie http://example.com/ geändert wird (und ich möchte das hardcoded nicht ändern müssen) Pfad nach dem Hochladen auf den Server, daher diese Frage natürlich).

0

Sie können die richtige Antwort basierend auf Ihrem Wissen über Ihren spezifischen Ordner und Ihre Webstruktur schätzen, aber das ist bei weitem keine allgemeine Lösung. Aber ich würde dir empfehlen, eine Bootrap-Datei zu verwenden, die der Einstiegspunkt für jede "Seite" ist. Dort können Sie $basePath Variable und andere benötigte Werte einrichten.

Eine andere Sache, die Sie tun können, ist die Basis Pfad zu Ihrem $_SERVER Array von Apache zu injizieren (wenn das, was Sie verwenden. Es wäre dann auf Ihre gesamte Anwendung zur Verfügung.

für einen Zeiger auf, wie man erreichen diese Angebote können Sie here aussehen.

oder eine Konfigurationsdatei haben den Basispfad für einen bestimmten Server enthält.

Verwandte Themen