RewriteCond REQUEST_URI - ^ funktioniert nicht wie erwartet
Ich bin den Aufbau einer Website in codeigniter. Ich habe eine Reihe von rewrite-Konditionen & Regeln .htaccess-Datei. Der erste Satz von Regeln, schaltet SSL an oder aus, je nachdem auf das erste segment der uri.
Dann durchläuft es erneut & wenn eine übereinstimmung gefunden wird, leitet die Seite entsprechend. Wenn keine übereinstimmung vorhanden ist, und die uri beginnt NICHT mit einem der aufgelisteten Zeichenfolgen, leitet es Sie zu einer anderen Seite. Wenn keine Bedingungen erfüllt sind, geht es an die index-Seite.
Ist das problem mit meinem ersten Satz von Regeln, die wiederum SSL on & off. Ich möchte, um anzugeben, dass der uri muss STARTEN mit admin oder sichern. Aber wenn ich die ^, um den Anfang des Strings, alles bricht. Hier ist, was ich habe:
RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} ^/?(admin|secure)
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
RewriteCond %{HTTPS} on
RewriteCond %{REQUEST_URI} !^/?(admin|secure)
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [R=301,L]
...specific rewrites here
RewriteRule ^secure-form1$ secure/contract/secure-form1 [L]
RewriteRule ^secure$ secure/article/secure [L]
RewriteCond %{HTTP_HOST} ^www.example.com$
RewriteCond %{REQUEST_URI} !^/(admin|form|secure|page)/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/page/article/$1 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
Wenn ich die ^ - symbol in den ersten 2 rewrite-Bedingungen (https on & off), dann
http://www.example.com/secure
schreibt an
https://www.example.com/index.php/secure/article/secure
das ist die Letzte rewrite-Regel. Die url tatsächlich ändert sich dieser im browser.
Wenn ich das ^ - symbol aus den ersten 2 umschreiben die Bedingungen, dann geht es auf der rechten Seite. Aber ich muss zu geben Sie den Beginn der uri, da gibt es andere Seiten, die "sicher" in der Mitte der uri (und nach einem Schrägstrich), die NICHT SSL verwenden.
Ich kann nicht herausfinden this one out.
Nein, ich kann nichts finden
InformationsquelleAutor user1669830 | 2012-09-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen, diese:
InformationsquelleAutor Ωmega
Alte Frage, ich weiß, aber es gibt eine andere Lösung, die vielleicht besser funktionieren, wenn Sie wirklich wollen, zu halten mit den
%{REQUEST_URI}
Zustand:Der wesentliche Unterschied gegenüber der OP ist die Einbeziehung von
/?
zu prüfen, die Anwesenheit von einem Schrägstrich am Anfang der URI. AFAIK, verschiedenen Apache-Installationen möglicherweise oder möglicherweise nicht enthalten die Eröffnung Schrägstrich in%{REQUEST_URI}
.Ein Vorteil dieser Methode ist, dass man die Regel anwenden, um mehrere Bedingungen:
Für die Art, wie ich denke, es ist einfacher zu arbeiten, als mit einer langen Kette von pipe-getrennten Zeichenfolgen. Dies geht allerdings auf Kosten einer möglichen effizienzverlusten im Vergleich zu einem einzelnen regex, aber es gibt einige andere Verbesserungen, die Sie machen können, um dies auszugleichen:
Verwenden Sie die lexographically gleich Betreiber
!=on
. Wenn Sie nuroff
es wird als regulärer Ausdruck behandelt.Beseitigen die RewriteRule Muster, ersetzen Sie es mit einem einzigen Cursor, dann verwenden Sie die environment vars
%{HTTP_HOST}
und%{REQUEST_URI}
. Dies spart den Aufwand für einen längeren regex-Muster sowie die backrefs.%{REQUEST_URI}
". Also, wenn nicht, dann ist dein code ist falsch, da%{HTTP_HOST}%{REQUEST_URI}
würde, enthalten keine slash-Trennzeichen.Tolle Antwort. Ein kleines problem, obwohl. Sie erwähnen, dass REQUEST_URI kann oder kann nicht auch die Eröffnung Schrägstrich. So ist es dann ungewöhnlich scheint darauf zu verlassen, dass es enthalten ist, wenn den Wiederaufbau der URL. Es scheint besser, fügen Sie den Schrägstrich explizit auf die redirect-URL und vielleicht erfassen Sie den Pfad in der RewriteRule oder eine andere Lösung, die sich nicht auf REQUEST_URI einschließlich der Schrägstrich, so dass Ihre gesamte Lösung umfasst sowohl setups. Derzeit, wenn es kein slash im REQUEST_URI, die Weiterleitungs-URL wird gebrochen werden, ist das Zusammenführen der host mit der URI und kein slash. Danke.
Das sind gute Punkte von @Ωmega und @NigelPeck über die fehlende slash. Ich nehme an, dass ich dachte, der Schrägstrich Hinzugefügt werden könnten, sobald Sie ermitteln die Anforderungen Ihrer Umgebung. Wenn Sie unbedingt brauchen, um Unterstützung für beide Fälle, eine einfache Lösung ist es, einfach den slash in der rewrite Pfad, da
www.example.com//top-secret
ist eine gültige URI.InformationsquelleAutor njbair