2017-06-27 12 views
-1

Ich habe eine Datei header.php, die ich als ein Include auf jeder Seite meiner Website verwende. Darin befinden sich die Navigationslinks der Site.Relative Dateipfade für Links innerhalb eines PHP sind

Hinweis: Ich möchte keine absoluten Dateipfade verwenden, da ich keine Ahnung von der Ordnerstruktur des Servers habe, auf dem die Site hochgeladen werden soll. Es muss funktionieren, egal wo die Website auf dem Server platziert wird. In diesem Sinne habe ich zwei Fragen:

) Gibt es einige PHP kann ich auf den Anfang des Dateipfads anwenden, wenn ich die header.php? Meine Website wird viele Unterverzeichnisse haben und es wird einfach zu zeitaufwendig sein, die Website mental zu durchqueren, um auf den Ordner zu zeigen, in dem sie sich jedes Mal befindet, wenn ich sie einfügen möchte.

) Wie kann ich sicherstellen, dass die Navigationslinks in der header.php immer korrekt sind? z.B. Ein Link zurück zur Homepage wäre "../index.php", wenn es ein Verzeichnis darunter wäre, aber sonst würde es nicht funktionieren.

Ich würde sehr dankbar Hilfe, danke.

+0

Befinden sich alle Dateien der Site im Stammverzeichnis des Dokuments? –

+0

Wir haben ein ähnliches Problem mit einem Autoloader gelöst, um eine Klasse aufzurufen, die in mehreren Skripten verwendet wird, einige in verschiedenen Unterverzeichnissen. Versuchen Sie, Ihr header.php-Skript in eine Klasse zu setzen und dann einen Autoloader aufzurufen, es vereinfacht Ihr Projekt sehr und Sie brauchen nicht 30 in jedem Skript, um alle Ihre Abhängigkeiten zu laden. – ctwheels

+0

@AdamForbis Ja, aber das Dokument root wird anders sein, sobald es auf dem Server ist. Also kann ich nicht etwas wie $ _SERVER ['DOCUMENT_ROOT'] verwenden. – user3669771

Antwort

0

Verwendung der magischen Konstante __DIR__ ...

Von der PHP-Dokumentation:

DIR Das Verzeichnis der Datei. Wenn es in einem Include verwendet wird, wird das Verzeichnis der enthaltenen Datei zurückgegeben. Dies entspricht dirname (FILE). Dieser Verzeichnisname hat keinen abschließenden Schrägstrich , es sei denn, es ist das Stammverzeichnis.

dann wie folgt verwenden:

$ file = DIR. "/../somefile.txt";

auch in header.php (oder einem anderen Skript, das ist immer zuerst geladen, können Sie eine Konstante gesetzt:

const PROJECT_DIR = __DIR__ . "/.."; 

und dann beziehen sich immer auf PROJECT_DIR

Dies ist knifflig:/Ich glaube nicht, dass es möglich ist, und es klingt auch sehr unsicher (wenn Sie auf alle Dateien auf dem Server zugreifen können, indem Sie einfach eine Reihe von .. s hinzufügen, zum Beispiel: ../../../../../../../etc/passwd

Viel Glück!

+0

Wie sollen sie Zugriff auf die 'PROJECT_DIR'-Variable erhalten? – ctwheels

1

zunächst eine PHP-Datei, die Ihre Pfade enthalten (Name es zum Beispiel ini.php und steckte es in Ordner ini):

defined("YOUR_BASE_PATH") 
    or define("YOUR_BASE_PATH", realpath(dirname(__FILE__) . '/..')); 

dann in der Kopfzeile.php gehen Sie wie folgt (umfassen INI-Datei, die Ihren Pfad enthält definiert):

include_once(dirname(__FILE__) . "/ini/ini.php"); 
include_once(YOUR_BASE_PATH . "/nocache.php"); 

Und jetzt leicht Sie Pfade in Ihrem Projekt ohne Aufwand nutzen! Ziemlich gute Lösung und Sie können den Ordner verschieben, wie Sie möchten, solange Sie die Ini-Datei aktualisieren!

Nun, da Sie es so eingerichtet haben, können Sie alle Ihre Links ändern Sie den tatsächlichen Pfad zu verwenden:

<a href="<?php echo PathToUrl(YOUR_BASE_PATH . "/index.php"); ?>">test link</a> 

Machen Sie eine einfache Funktion in Ihrem header.php für PathToUrl:

function PathToUrl($path) 
{ 
    $path = str_replace($_SERVER['DOCUMENT_ROOT'], '', $path) 
    return $path; 
} 

Das sollte es tun.

+0

Die vorgeschlagene Lösung funktioniert für beliebig viele Unterordner. Sie müssen nur eine Datei in Ihrer Ordnerstruktur angeben, die die anderen Pfade angibt, die Sie verwenden können. –

+0

Die Verwendung von (dirname (__ FILE__) verursacht in der Chrome-Konsole die Fehlermeldung "Lokale Ressource nicht laden". – user3669771

0

Ja, mit PHP magische Konstanten. Versuchen Sie Folgendes:

__DIR__ 

, dass in Ihre Links sind vor dem Beginn des Strings ... Beispiel:

require __DIR__ . "/file_name.php";

Sie können mehr darüber lesen Sie hier: http://www.php.net/manual/en/language.constants.predefined.php

+0

'__DIR__': Das Verzeichnis der Datei. Wie gelangen sie von jedem Ort in die header.php? ihr Verzeichnis? Verschachteltes Unterverzeichnis zum Beispiel? Wenn sie Ihr Skript innerhalb 'dir' verwenden, ist die' __DIR__' Variable 'dir', wenn sie in' dir/subdir' verwendet wird, dann wird '__DIR__' 'dir/subdir' sein. – ctwheels