2016-07-29 24 views
1

Meine ist Ordnerstruktur etwas wie folgt aus:Wie behebe ich Links in verschiedenen Verzeichnissen bei der Verwendung von htaccess und RewriteRules?

.htaccess 
index.php 
topics.php 
create.php 
register.php 
templates/ 
    frontpage.php 
    topics.php 
    create.php 
    register.php 
    includes/ 
     header.php 
     footer.php 

Wenn ich auf index.php die Links in Kopf- und Fußzeile Arbeit perfekt. Um die URLs zu reinigen, habe ich eine .htaccess-Datei, die wie folgt aussieht:

RewriteEngine On # Turn on the rewriting engine 

# Manually rewriting rules for pages to preserve user profile pages - need to fix later 
RewriteRule ^about$   about.php   [NC,L] # take out .php extention 
RewriteRule ^register$  register.php  [NC,L] # take out .php extention 
RewriteRule ^create$  create.php [NC,L] # take out .php extention 

# Rewrite topic page 
RewriteRule ^topics/category/([A-Za-z0-9-]+)/?$ topics.php?category=$1 [NC,L] 

# Rewrite user profile pages to MyMentor.Codes/username 
RewriteRule ^([A-Za-z0-9-]+)/?$ user.php?username=$1 [NC,L] 

Meine Links in header.php sieht wie folgt aus:

<a href="about"></a> 
<a href="register"></a> 
<a href="create"></a> 
<a href="find-mentor"></a> 

Und die Themen Link in footer.php loos wie folgt aus:

<a href="topics/category/<?php echo $category->name; ?>"><?php echo $category->name; ?></a> 

lassen Sie uns jetzt sagen, dass ich auf der Seite bin website.com/topics.php?category=programs Mein .htaccess Seite ändert es auf website.com/topics/category/programs so wie es sein sollte.

jedoch jetzt, dass ich bei website.com/topics/category/programs all meinen Links in Header website.com/topics/category/index.php gehen (oder was auch immer Link wäre es), und die Themen Link in der Fußzeile website.com/topics/category/topics/category/programs

Innenkopf geht, kann ich ändern Sie die Links zu <a href="../../myLink">, und das wird die Links für topics.php beheben, aber offensichtlich verwirrt dies die Links, wenn ich auf einem der Controller-Seiten auf dem gleichen Niveau bin wie index.php

und Gleiches gilt für die Fußzeile, I könnte es zu <a href="<?php echo $category->name; ?>"><?php echo $category->name; ?></a> ändern, die den Link wenn innerhalb themes.php behebt, aber wieder, wenn ich o bin n das Stammverzeichnis wie index.php oder eine andere Seite auf dieser Ebene geht der Link zu website.com/programs und wirkt, als ob es eine meiner Benutzerprofilseiten (siehe .htaccess)

Wie kann ich diese Links oder meine .htaccess Seite so dass ich don beheben muss nicht für jede Seite eine eigene Kopf- und Fußzeile haben?

Antwort

0

Ich fand es heraus. Ich habe diese auf meiner Website in (in eine config.php Seite):

define ('BASE_URI', 'http://'.$_SERVER['SERVER_NAME'].'/myWebsite/'); 

Dann, bevor alle meine Links, habe ich nur noch <?php echo BASE_URI; ?>

1

Präfix Ihre Links mit einer /. Zum Beispiel ändern

<a href="about"></a> 

Um

<a href="/about"></a> 

Das Problem, das Sie Gesicht ist, dass, wenn der Browser nur "about" sieht es denkt, dass Sie diesen Weg in Bezug auf die aktuelle Position wollen, so fragt es den Server für den falschen Lage. Stattdessen wollen Sie den vollständigen Pfad verwenden, wie Sie .htaccess erwarten, dass es

Als Antwort auf Ihren Kommentar unten, um zu sehen: Wenn Sie .htaccess alle Pfade mit website/ voranstellen wollen, fügen Sie die zweite Regel unten, wenn Sie ermöglichen mod Rewrite

RewriteEngine on <- you should already have this 
RewriteBase '/website/' 

Und bewegen Sie die .htaccess eine Ebene nach oben, so dass es in der website/ Verzeichnis ist.

Die obige Lösung ist einfach, aber ich würde es nicht auf meiner eigenen Maschine tun.Eine Lösung, die etwas mehr Arbeit braucht, aber den Vorteil hat, alle Ihre Dateien innerhalb website/ zu behalten, besteht darin, die Apache-Einstellung zu bearbeiten (vorausgesetzt, Sie verwenden Apache), die das Stammverzeichnis Ihrer Website bestimmt. Dies ist derzeit für Ihre Localhost-Site falsch konfiguriert.

Ihre aktuelle Einstellung ist htdocs/. Aus diesem Grund navigiert der Browser zu localhost/thisPage. Was Sie wollen ist, dass jede Seite ihren eigenen Stammordner hat, also müssen wir die Einstellung zu htdocs/website/

ändern Dies wird in der Datei httpd-vhosts.conf getan. Suchen Sie nach dem VirtualHost Abschnitt, der mit Ihrem aktuellen Standort zu tun hat und ändern DocumentRoot so sieht es ähnlich wie:

<VirtualHost *:80> 
    DocumentRoot "path/to/htdocs/website" 

Sie benötigen die Webserver neu starten, damit die Änderungen wirksam werden. Sobald sie das tun, können Sie das RewriteBase, das wir früher eingerichtet haben, entfernen oder einfach auf / setzen

+0

ich auf localhost bin Tests. Wenn ich alle meine Links bearbeitet habe, um das '/' hinzuzufügen, werden alle Seiten jetzt auf 'localhost/thisPage' anstatt auf '/ localhost/website/thisPage' geleitet. – amallard

+0

@amallard siehe meine aktualisierte Antwort. – BeetleJuice

+0

Mit 'Rewrite Base '/ website /'' Erhalte ich einen Serverfehler 500. Wenn ich ihn zu 'RewriteBase '/ website /'' ändere und die '/' vor meinen Links belasse, gehen sie immer noch zu 'localhost/thisPage' – amallard