Frage

Ich möchte mod Rewrite verwenden in Web-Adressen wie / Verzeichnis /directory/index.html , in einem Standard-LAMP-Hosting-Situation zu konvertieren. Was ich habe Werke für Adressen, die in einem Schrägstrich. Ich kann nicht einen Weg zu handhaben Adressen finden, die keinen Schrägstrich .

Was scheint, wie es funktionieren soll, ist:

rewriterule ^(.*)/$ $1/index.html [L] /* addresses ending in / */
rewriterule ^(.*(?!html))$ $1/index.html [L] /* where the problem is */

Aber die zweite Zeile führt zu einem 500-Serverfehler. Wenn ich einen einzelnen Buchstaben x in die zweite Zeile hinzufügen:

rewriterule ^(.*)/$ $1/index.html [L]
rewriterule ^(.*x(?!html))$ $1/index.html [L]

Es beginnt zu arbeiten, aber nur für Verzeichnisnamen, die in einem x-Ende . Ich habe versucht, die x mit vielen verschiedenen Dingen zu ersetzen. Alles, was komplizierter als echte Charaktere (wie [^ x] oder. +) Verursacht einen 500-Serverfehler.

Und meine eigene Neugier zu befriedigen, weiß jemand, warum der Zusatz eines einzigen echten Briefes, den Unterschied zwischen einem Serverfehler macht und eine perfekt funktionierende Regel?

[akzeptierte Antwort] Dank Gumbo konnte ich eine Lösung mit RewriteCond nähern:

rewritecond %{REQUEST_URI} !\.[^/]+$
rewriterule (.+) $1/index.html [L]

Dies funktioniert, aber filtert mehr als nur .html - es andere Seiten im Internet sperren könnte. Leider

rewritecond %{REQUEST_URI} !\.html$

Ergebnisse in einem Serverfehler:

  

Anfrage überschritten die Grenze von 10 internen Umleitungen wegen wahrscheinlichen Konfigurationsfehler. Verwenden Sie ‚LimitInternalRecursion‘ die Grenze zu erhöhen, falls erforderlich.

Ich würde noch gerne wissen, warum:

rewriterule ^(.*(?!html))$ $1/index.html [L]

Ergebnisse in einer Schleife. Die erste Hälfte soll überprüfen, ob es nicht Ende in .html. Seit der zweiten Hälfte fügt .html, scheint es, wie die funktionale Äquivalent:

while(substr($address,-4)!='html') $address.='html'

Natürlich bin ich etwas fehlt.

War es hilfreich?

Lösung

Verwenden Sie eine RewriteCond Richtlinie zu überprüfen, ob der URL-Pfad mit einem .html endet nicht:

RewriteCond %{REQUEST_URI} !\.html$
RewriteRule ^(.*[^/])?/?$ $1/index.html [L]

Bearbeiten Sie verwenden eine Vorgriff Behauptung ((?!…)). Aber es gibt nichts nach .* (nur ein $). So versucht, einen Blick hinter Behauptung statt:

RewriteRule ^.*$(?<!html) $0/index.html [L]

Beachten Sie aber, dass Sie wahrscheinlich 2.2 benötigen Apache diese Behauptungen zu verwenden.

Andere Tipps

Nun, eigentlich macht es funktioniert, Sie könnten nur eine negative Lookbehind verwenden statt einer Look-Ahead:

RewriteRule ^(.*)(?<!html)$ $1/index.html [L]

Ich bin mir nicht sicher, warum offhand Hinzufügen der ‚x‘ macht es Arbeit, ich werde bearbeiten, wenn ich es herausfinden.

Für warum die x Hinzufügen macht es Arbeit: Wenn der Ersatz wird die Regex übereinstimmen, wird die RewriteRule wieder angewendet werden. Als Beispiel führt dies auf einen Fehler:

RewriteRule ^(.*)$ $1.rb

, weil es script mit script.rb ersetzen würde. Das entspricht den regulären Ausdruck, so dass es ersetzt script.rb mit script.rb.rb, immer wieder ...

Das bei im Fehlerprotokoll angedeutet wird:

Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary.

In Ihrem Beispiel, fügen Sie an das Ende index.html. Wenn es eine x ist am Ende der Regex, dann wird es nicht Ihren Ersatz übereinstimmen, die in einem l endet.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top