.htaccess neu schreiben, um die Stamm-URL in das Unterverzeichnis umzuleiten

246

Versuchen zu bekommen

www.example.com

direkt zu gehen

www.example.com/store

Ich habe mehrere Codebits ausprobiert und keine funktionieren.

Was ich versucht habe:

Options +FollowSymlinks
RewriteEngine on

RewriteCond %{HTTP_HOST} ^example.com$
RewriteRule (.*) http://www.example.com/$1 [R=301,L]

RewriteCond %{HTTP_HOST} ^(.+)\www.example\.com$
RewriteRule ^/(.*)$ /samle/%1/$1 [L]

Was mache ich falsch?

Willi Mentzel
quelle

Antworten:

275

Sie können eine Umschreiberegel verwenden, die ^ $ verwendet , um den Stamm darzustellen, und diese in Ihr / store-Verzeichnis umschreiben, wie folgt:

RewriteEngine On
RewriteRule ^$ /store [L]

quelle
6
RewriteRule ^ /? $ /Index.do [R]
Barclay
2
^ / $ scheint nie zu passen, also denke ich ^ /? $ ist nicht notwendig.
NateS
Ist es dann möglich, die vollständige URL anzuzeigen und die Verarbeitungsregeln fortzusetzen? In meinem Fall schreibe ich einige URLs neu, damit sie hübsch sind. Dadurch bleibt die URL example.com erhalten - ich möchte example.com/store und dann mit anderen Umschreibungen fortfahren.
Gin93r
Funktioniert auch gut für mich.
Jitesh Sojitra
1
Erst kürzlich habe ich viel Zeit damit verbracht, zu debuggen, warum dies auf einer Site in Ubuntu Apache 2.4.7 nicht funktioniert hat. Das Debuggen beim Umschreiben zeigte, dass die Regel getroffen wurde und eine INTERNE REDIRECT generiert wurde. Dann schien es nur zu parken und nach einer Indexseite zu suchen. Es stellt sich heraus, dass wenn mod_dir aktiviert ist UND es einen Indexseitenkandidaten im Verzeichnis gibt, dieser den mod_rewrite überschreibt, es sei denn, Sie setzen: DirectoryCheckHandler On
Gerrit
142

Ich war überrascht, dass niemand dies erwähnte:

RedirectMatch ^/$ /store/

Grundsätzlich wird der Stamm und nur die Stamm-URL umgeleitet. Die Antwort stammt von diesem Link

Dio Phung
quelle
3
Danke, das hat bei mir mit einer bereits bestehenden Regel großartig funktioniert. kein Konflikt.
Wissenschaftler
1
Dieser funktioniert perfekt. Außerdem werden sowohl http als auch https behandelt.
Sayem Shafayet
3
Und dies für 301 Weiterleitung:RedirectMatch 301 ^/$ /store/
Andrea
Ja, es ist einfacher als beim Umschreiben. Vielen Dank!
Orden
2
@Andrea Und dies für 302 temporäre Weiterleitung: RedirectMatch 302 ^ / $ / store /
Faizan Anwer Ali Rupani
108

Versuche dies:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^example\.com$
RewriteRule (.*) http://www.example.com/$1 [R=301,L]
RewriteRule ^$ store [L]

Wenn Sie eine externe Weiterleitung wünschen (wodurch der besuchende Browser die umgeleitete URL anzeigt), setzen Sie dort auch das RFlag:

RewriteRule ^$ /store [L,R=301]
Gumbo
quelle
4
Das hat wunderbar funktioniert. Sowohl sample.com als auch www.sample.com leiten zu www.sample.com/store weiter. Genau das wollte ich. Danke Gumbo und allen, die geantwortet haben. Ich habe viel gelernt, als ich Ihre Antworten gelesen habe, und freue mich über das Feedback.
1
Ich bin gespannt, wird dies www.example.comnach der Weiterleitung als URI angezeigt? Wenn nicht, wie würde sich dies ändern?
Stefmikhail
1
♦ - Und warum sollte Ihre Lösung besser sein als die von Sander unten? Ich stelle fest, dass Ihre letzte Zeile dieselbe ist, aber wenn das alles ist, was benötigt wird, warum sollten Sie die RewriteCondund die erste einschließen RewriteRule?
Stefmikhail
Wenn dieser Code verwendet wird, können Sie Ihren Browser exmple.com/../aboveSubDir eingeben?
@GamErix Dies /aboveSubDirwird entweder vom Browser oder vom Server gelöst .
Gumbo
79

Folgendes habe ich verwendet, um in ein Unterverzeichnis umzuleiten. Dies hat es unsichtbar gemacht und ermöglicht immer noch durch Anfragen, die mit einer vorhandenen Datei oder was auch immer übereinstimmen.

RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www.)?site.com$
RewriteCond %{REQUEST_URI} !^/subdir/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /subdir/$1
RewriteCond %{HTTP_HOST} ^(www.)?site.com$
RewriteRule ^(/)?$ subdir/index.php [L]

Ändern Sie site.com und unterschreiben Sie mit Ihren Werten.

Jage
quelle
Funktioniert wie erwartet! Toll!
Kachar
Die Homepage war 'Stealth' ... aber sobald ich auf einen Link klicke, wird der Name des Unterverzeichnisses in der Adressleiste angezeigt ... gibt es eine Möglichkeit zu verhindern, dass der Name des Unterverzeichnisses angezeigt wird?
dsdsdsdsd
4
nur root - macht keine Unterverzeichnisse
php-b-grader
3
Für mich gibt es "Internal Server Error": /
Pithikos
1
Vielen Dank, Sie wissen nicht, wie lange ich genau danach gesucht habe.
Basis Wunsch
26

Um eine unsichtbare Umleitung vom Stammverzeichnis zum Unterordner festzulegen, können Sie die folgende RewriteRule in /root/.htaccess verwenden:

RewriteEngine on

RewriteCond %{REQUEST_URI} !^/subfolder
RewriteRule ^(.*)$ /subfolder/$1 [NC,L]

Die obige Regel leitet den Browser intern weiter von:

zu

Und

zu

während der Browser im Stammordner bleibt.

starkeen
quelle
1
Dies sollte die akzeptierte Antwort sein ... Die RewriteRule (wie in einigen anderen Antworten vorgeschlagen) bewirkt eine unendliche Umleitung, da / subfolder zu / subfolder / subfolder usw. umgeleitet wird ... der RewriteCond% {REQUEST_URI}! ^ / Subfolder stellt sicher, dass eine URL, die bereits umgeleitet wurde, nicht erneut ausgeführt wird
Patrick
21

Eine weitere Alternative, wenn Sie die URL neu schreiben und die ursprüngliche URL ausblenden möchten:

RewriteEngine on
RewriteRule ^(.*)$ /store/$1 [L]

Wenn Sie beispielsweise eingeben http://www.example.com/product.php?id=4, wird die Datei transparent geöffnet http://www.example.com/store/product.php?id=4, ohne dass dem Benutzer die vollständige URL angezeigt wird.

gaborous
quelle
2
Fügen Sie QSA(Abfragezeichenfolge anhängen) zu [L]( [L, QSA]) hinzu, wenn Abfragezeichenfolgen auf die neu geschriebene URL übertragen werden sollen.
Devios1
@chaiguy danke für den Tipp, aber auf meinem Server hat es ohne QSA funktioniert (aber ich stimme zu, dass es wahrscheinlich besser ist, QSA anzuhängen). Vielleicht liegt es an einer speziellen Konfiguration meines Apache-Servers?
gaborous
1
Diese Methode für mich, example.com, zeigt Inhalte von example.com/store transparent an, aber example.com/test leitet zu example.com/store/test weiter und zeigt die URL
Geoffrey Hale
14

Dies schien die einfachste Lösung zu sein:

RewriteEngine on
RewriteCond %{REQUEST_URI} ^/$
RewriteRule (.*) http://www.example.com/store [R=301,L]

Ich bekam Umleitungsschleifen mit einigen der anderen Lösungen.

user1801050
quelle
2
Dieser versteckt das Verzeichnis nicht
PHP-B-Grader
8

Ich verstehe deine Frage nicht ...

Wenn Sie jede Anforderung in einen Unterordner umleiten möchten:

RewriteRule ^(.*)$ shop/$1 [L,QSA]

http://www.example.com/* -> wwwroot/store/*

Wenn Sie zu einem Unterordner mit dem Domänennamen umleiten möchten

RewriteCond %{HTTP_HOST} ([^\.]+\.[^\.]+)$
RewriteRule ^(.*)$ %1/$1 [L,QSA]

http://www.example.com/* -> wwwroot/example.com/*
inf3rno
quelle
Ich möchte, dass Ihr Code ([^\.]+\.[^\.]+)$die Domain als Unterordnernamen reserviert.
Chetabahana
6

Ich habe festgestellt, dass es wichtig ist, den Umfang der Umleitung auf das Stammverzeichnis zu beschränken, um eine zirkuläre Umleitung zu vermeiden. Ich hätte verwendet:

RewriteEngine on
RewriteCond %{REQUEST_URI} ^/$
RewriteRule (.*) http://www.example.com/store [R=301,L]
Nir O.
quelle
6

Die meisten der oben genannten Lösungen sind korrekt, aber allen fehlt die Transparenz der Umleitung.

In meinem Fall wollte ich beim Besuch von www.example.com in das Unterverzeichnis / den Store umgeleitet werden, ohne jedoch die URL zu www.example.com/store zu aktualisieren . (Ich möchte nur den Seitencode aus diesem Verzeichnis abrufen.) In diesem Fall funktioniert die folgende Lösung einwandfrei.

RewriteEngine on
RewriteCond %{HTTP_HOST} example\.com [NC]
RewriteCond %{REQUEST_URI} ^/$
RewriteRule ^(.*)$ /store/$1 [L]

Quelle: http://wiki.dreamhost.com/Transparently_redirect_your_root_directory_to_a_subdirectory

Mahmoud Zalt
quelle
Was sollte ich ändern, wenn ich brauchte, dass www.example.com zu www.othersite.com/store umgeleitet wurde, ohne die URL zu aktualisieren? Ich habe versucht, konnte aber Ihren Code nicht anpassen
Schritte
Ich habe versucht, die letzte Zeile in zu ändern, RewriteRule ^(.*)$ http://otherpage.com/subfolder/$1 [L]aber es aktualisiert die URL
Schritte
Alles was Sie brauchen, ist die Wörter exampleund zu ersetzen store.
Mahmoud Zalt
Ich habe es nicht ganz gut erklärt. Ich besitze example.comund otherpage.comDomains. Wenn ich besuche, example.commöchte ich, dass der Inhalt von otherpage.com/subfolderangezeigt wird, ohne die URL zu aktualisieren
Schritte
Nun, meine Antwort oben macht das nicht. Versuchen Sie, eine neue Frage zu stellen.
Mahmoud Zalt
4

Früher verwende ich den folgenden Code, der korrekt funktioniert, um die Stamm-URL jeder meiner Domänen / Unterdomänen in ihre entsprechenden Unterverzeichnisse umzuleiten, die genau wie die Unterdomäne selbst benannt sind:

RewriteCond %{HTTP_HOST} ^sub1.domain1.com
RewriteCond %{REQUEST_URI} !subs/sub1.domain1.com/
RewriteRule ^(.*)$ subs/%{HTTP_HOST}/$1 [L,QSA]

RewriteCond %{HTTP_HOST} ^sub2.domain1.com
RewriteCond %{REQUEST_URI} !subs/sub1.domain2.com/
RewriteRule ^(.*)$ subs/%{HTTP_HOST}/$1 [L,QSA]

RewriteCond %{HTTP_HOST} ^sub1.domain2.com
RewriteCond %{REQUEST_URI} !subs/sub1.domain2.com/
RewriteRule ^(.*)$ subs/%{HTTP_HOST}/$1 [L,QSA]

RewriteCond %{HTTP_HOST} ^sub2.domain2.com
RewriteCond %{REQUEST_URI} !subs/sub2.domain2.com/
RewriteRule ^(.*)$ subs/%{HTTP_HOST}/$1 [L,QSA]

Wenn ich jedoch weitere Subs oder Domains hinzufügen möchte, muss dies im obigen Code hinzugefügt werden. Es sollte viel bequemer sein, es so zu vereinfachen, dass es wie ein Platzhalter (*) funktioniert :

RewriteCond %{HTTP_HOST} ^sub
RewriteCond %{REQUEST_URI} !/subs/
RewriteRule ^(.*)$ subs/%{HTTP_HOST}/$1 [L,QSA]

Wenn also eine andere Subdomain / Domain hinzugefügt wird, solange der Subdomainname das Präfix sub hat (wie: sub3.domain1.com, sub1.domain3.com usw.), bleibt der Code gültig.

Chetabahana
quelle
3

Ich denke, die Hauptprobleme mit dem Code, den Sie gepostet haben, sind:

  • Die erste Zeile stimmt auf einem Host überein, der streng mit sample.com beginnt, sodass www.sample.com nicht übereinstimmt.

  • Die zweite Zeile möchte mindestens ein Zeichen, gefolgt von www.sample.com, das ebenfalls nicht übereinstimmt (warum sind Sie dem ersten w entkommen?).

  • Keine der enthaltenen Regeln leitet zu der URL weiter, die Sie in Ihrem Ziel angegeben haben (außerdem ist das Beispiel als samle falsch geschrieben, aber das ist irrelevant).

Als Referenz ist hier der Code, den Sie derzeit haben:

Options +FollowSymlinks
RewriteEngine on

RewriteCond %{HTTP_HOST} ^sample.com$
RewriteRule (.*) http://www.sample.com/$1 [R=301,L]

RewriteCond %{HTTP_HOST} ^(.+)\www.sample\.com$
RewriteRule ^/(.*)$ /samle/%1/$1 [L]
Artem Russakovskii
quelle
2

Ein wenig googeln gibt mir folgende Ergebnisse:

RewriteEngine On
RewriteBase /
RewriteRule ^ index. (. *)? $ Http://domain.com/subfolder/ [r = 301]

Dadurch wird jeder Versuch, auf eine Datei mit dem Namen index.something zuzugreifen, in Ihren Unterordner umgeleitet, unabhängig davon, ob die Datei vorhanden ist oder nicht.

Oder versuchen Sie Folgendes:

RewriteCond% {HTTP_HOST}! ^ Www.sample.com $ [NC]
RewriteRule ^ (. *) $% {HTTP_HOST} / samlse / $ 1 [R = 301, L]

Ich habe in der .htaccess-Datei nicht viel umgeleitet, daher bin ich mir nicht sicher, ob dies funktionieren wird.

Steven
quelle
2

Zwei Möglichkeiten für mögliche Lösungen, um dies zu erreichen, sind: 1. Erstellen Sie eine .htaccessDatei im Stammordner wie unter (ersetzen Sie einfach example.com und my_dir durch Ihre entsprechenden Werte):

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www.)?example.com$
RewriteCond %{REQUEST_URI} !^/my_dir/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /my_dir/$1
RewriteCond %{HTTP_HOST} ^(www.)?example.com$
RewriteRule ^(/)?$ my_dir/index.php [L] 
</IfModule>
  1. Verwenden Sie RedirectMatch, um nur die Stamm-URL "/" in einen anderen Ordner oder eine andere URL umzuleiten.

    RedirectMatch ^ / $ http://www.example.com/my_dir

Mushtaq Hussain
quelle
1

Versuchen Sie, die folgenden Zeilen in htaccess zu verwenden

Hinweis: Möglicherweise müssen Sie den Namen der Datei default.html überprüfen

default.html ist die Datei, die standardmäßig im Stammordner geladen wird.

RewriteEngine

Redirect /default.html http://example.com/store/

Abouasy
quelle
0

Sie fügen diesen Code einfach in Ihre .htaccess-Datei ein

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /folder/index.php [L]
</IfModule>
karthikeyan ganesan
quelle
0

Ich beantworte die ursprüngliche Frage nicht, indem ich auf eine andere mögliche Syntax hinweise (es gibt viele unter den anderen Antworten), sondern indem ich auf etwas hinweise, mit dem ich mich einmal befassen musste. Ich habe eine Weile gebraucht, um herauszufinden:

What am I doing wrong?

Es besteht die Möglichkeit, dass% {HTTP_HOST} nicht richtig oder überhaupt nicht ausgefüllt wird. Obwohl ich nur gesehen habe, dass dies nur auf einem Computer auf einem gemeinsam genutzten Host auftritt, mit einigen benutzerdefinierten gepatchten Apache 2.2, ist dies dennoch eine Möglichkeit.

Μάκης Παλάσης
quelle
0

Dadurch wird das Unterverzeichnis ausprobiert, wenn die Datei nicht im Stammverzeichnis vorhanden ist. Ich brauchte dies, als ich eine einfache .html-Website, die voraussichtlich auf Root-Ebene ausgeführt wird, verschoben und in ein Unterverzeichnis verschoben habe. Funktioniert nur, wenn alle Dateien flach sind (kein .htaccess-Trick im Unterverzeichnis möglich). Nützlich für verknüpfte Dinge wie CSS- und JS-Dateien.

# Internal Redirect to subdir if file is found there.
RewriteEngine on
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_URI} !-s
RewriteCond %{DOCUMENT_ROOT}/subdir/%{REQUEST_URI} -s
RewriteRule ^(.*)$ /subdir/$1 [L]
mikeytown2
quelle