it-swarm.com.de

So entfernen Sie Unterverzeichnisordner mit htaccess aus der URL

Ich versuche, die Unterordner von meiner Site-URL zu entfernen.

Unten ist die Struktur meiner Ordner. Ich bin mir nicht sicher, wo ich meine .htaccess -Datei ablegen soll und was ich darauf schreiben soll:

  • mysiteroot
    • subdir1
    • subdir2
      • index.php
      • page1.php
      • page2.php
      • page3.php

Ich habe folgendes geschrieben:

RewriteEngine On
RewriteRule ^$ subdir1/subdir2/
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ subdir1/$1

Es scheint nur für den Index mit meiner .htaccess -Datei zu funktionieren, die sich im mysiteroot-Ordner befindet.

Wie kann ich die Anforderung stellen, dass page1.phpwww.mysiteroot.com/page1 anstelle von www.mysiteroot.com/subdir1/subdir2/page1.php anzeigt?

2
A-ndy

Ich habe das meiste bereits geschrieben, bevor Sie Ihre Lösung gepostet haben. Das Posten ist sowieso eine allgemeinere Lösung, die die Leser möglicherweise nützlich finden.


Wie kann ich die Anforderung stellen, dass page1.phpwww.example.com/page1 anstelle von www.example.com/subdir1/subdir2/page1.php anzeigt?

Sie tun dies, indem Sie die URLs in Ihrer Anwendung physisch ändern, nicht in .htaccess. Sobald die URLs in Ihrer Anwendung geändert wurden, ist die Anforderung für www.example.com/page1, die sichtbare URL, die Ihren Benutzern angezeigt wird (nicht für page.php). Sie verwenden dann mod_rewrite in .htaccess, um intern neu zu schreiben die sichtbare URL zurück zum Pfad des realen/verborgenen Dateisystems: /subdir1/subdir2/page1.php. (Aber ich vermute, dass Sie das bereits wissen, da Ihr Code das Richtige tut.)

In Ihrem Dateihierarchiediagramm wird subdir2 auf derselben Ebene angezeigt wie subdir1? Aus Ihrer Code- und URL-Struktur geht jedoch hervor, dass subdir2 ein Unterverzeichnis von subdir1 ist. Ich nehme das später an.

Grundsätzlich müssen Sie zwei Dinge tun:

  1. Schreiben Sie alle Anforderungen erneut an /subdir1/subdir2/ (mit Ausnahme von Anforderungen, die Dateien oder Verzeichnissen direkt zugeordnet sind).

  2. Fügen Sie die Dateierweiterung .php an Anforderungen an, die noch keine Dateierweiterung haben.

Versuchen Sie Folgendes in der Datei .htaccess im Dokumentstamm, d. H. mysiteroot/.htaccess.

RewriteEngine On

# If the request has already been rewritten
# Or maps to an existing file then stop here.
# (Can't test for dir here since would not rewrite the doc root)
RewriteCond %{ENV:REDIRECT_STATUS} . [OR]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ - [L]

# No file extension on request then append .php and rewrite to subdir
RewriteCond %{REQUEST_URI} /(.+)
RewriteRule !\.[a-z0-4]{2,4}$ /subdir1/subdir2/%1.php [NC,L]

# All remaining requests simply get rewritten to the subdir
RewriteRule (.*) /subdir1/subdir2/$1 [L]

Jede Anfrage für /path/to/file (die keiner Datei direkt zugeordnet wird) erhält intern neu geschrieben zu /subdir1/subdir2/path/to/file.php.

Die erste Anweisung RewriteCond stellt sicher, dass keine Anforderungen überschrieben werden, die bereits in das Unterverzeichnis überschrieben wurden, wodurch eine Überschreibungsschleife verhindert wird.

1
MrWhite

Ich fand die Lösung, die zu dem passte, was ich tun wollte. Online-Nutzer geben eine generierte Antwort, aber das Problem ist, dass ich nicht beabsichtige, dieselben Seitennamen ohne Erweiterungen zu verwenden, um auf meine Seiten zu verweisen. Das heißt, ich behalte eine Datei mit der Liste der Hauptseiten.

Im Folgenden sind die Details meiner Lösung aufgeführt: - Platzieren Sie die htaccess-Datei in meinem Stammordner. - Beziehen Sie sich mit einem absoluten Verweis auf die Seiten in den Unterverzeichnissen

htaccess Datei Inhalt:

RewriteEngine On
Options -Indexes #prevents access to folders
RewriteRule ^page1?$ ./subdir2/page1.php
RewriteRule ^page2?$ ./subdir2/page2.php

Damit funktionieren alle Seiten in htaccess so, als wären sie im Stammverzeichnis. Wenn Sie also eine Seite aufrufen möchten, die keine Hauptseite ist und sich in einem Unterordner befindet, beziehen Sie sich zu diesem Zeitpunkt auf den Stammordner

Einfache Lösungen funktionieren manchmal am besten

1
A-ndy