htaccess-Datei, um spezifische Umschreibungen auf verschiedenen URIs durchzuführen

htaccess-Datei, um spezifische Umschreibungen auf verschiedenen URIs durchzuführen

Folgendes habe ich in meiner .htaccessAkte:

<IfModule mod_rewrite.c>
    Options +FollowSymlinks
    RewriteEngine On

    # Block hidden directories
    RewriteRule "(^|/)\." - [F]

    # Prevent /health_check.php from using https
    RewriteCond %{REQUEST_URI} !(health_check\.php)$

    # Prevent /sns from using https but this DOES need codeigniter rewriting (see below)
    RewriteCond %{REQUEST_URI} !^/(sns)/

    # Reroute http to https
    RewriteCond %{HTTP:X-Forwarded-Proto} =http
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

    # Prevent rewriting of domain for codeigniter
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ ./index.php/$1 [L,QSA]

</IfModule>

Es scheint alles in Ordnung zu sein, bis auf den /snsTeil. Ich kann die Weiterleitung zu https nicht stoppen.

Ich möchte http://sub.example.com/snsnicht http://sub.example.com/health_check.phpauf https weiterleiten.

Antwort1

# Prevent /sns from using https but this DOES need codeigniter rewriting (see below)
RewriteCond %{REQUEST_URI} !^/(sns)/

Wenn die Anfrage-URL nicht mit einem abschließenden Schrägstrich endet (wie angegeben), dann gilt die obige Regel (die den abschließenden Schrägstrich amBedingungsmuster) wird immer erfolgreich sein (es ist einnegiertBedingung), sodass die Umleitung auf HTTPS immer erfolgt.

Idealerweise sollten Sie den abschließenden Schrägstrich früher in der Anfrage kanonisieren. Entweder Sie schließen den abschließenden Schrägstrich ein oder nicht (sonst ist es im WesentlichenDuplizierter Inhaltund könnte möglicherweise Probleme mit anderen Skripten verursachen, die die URL analysieren).

Um jedoch die beiden URLs /snsund /sns/dann verarbeiten zu können, müssen Sie den abschließenden Schrägstrich optional machen und den End-of-String-Anker ( ^) einschließen. Beispiel:

RewriteCond %{REQUEST_URI} !^/sns/?$

Beachten Sie, dass dies nur mit den beiden angegebenen URLs übereinstimmt. Eine URL der Form wird nicht übereinstimmen /sns/<something>.

Ich habe die Klammern um das Pfadsegment entfernt (Sie sollten auch andere Klammern in Ihrem regulären Ausdruck entfernen). Dies erstellt eine erfasste Gruppe und ist in den von Ihnen geposteten Anweisungen überflüssig.

AKTUALISIEREN:Sie müssen außerdem eine zusätzliche Prüfung durchführen, um sicherzustellen, dass die umgeschriebene URL (z. B. /index.php/sns) nicht umgeleitet wird. Sie können dies allgemeiner tun, indem Sie die HTTPS-Umleitung nur auf die ursprüngliche Anfrage anwenden, nicht auf die umgeschriebene Anfrage, indem Sie eine zusätzliche Bedingung einfügen:

# Only applies to direct requests (not rewritten requests)
RewriteCond {%ENV:REDIRECT_STATUS} ^$

Die REDIRECT_STATUSUmgebungsvariable wird nach dem ersten erfolgreichen Umschreiben (d. h. dem CodeIgniter-Routing) auf „200“ gesetzt. Bei der ersten Anforderung wird sie nicht gesetzt (d. h. ^$leere Zeichenfolge).

Wenn dies immer noch zu einer Weiterleitung führt, besteht die Möglichkeit, dass CodeIgniter selbst die Weiterleitung auslöst (nachdem sie .htaccessverarbeitet wurde).

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

Beiseite:Und wie in meinem Kommentar erwähnt, sollten Sie das ./Präfix entfernen auf demRewriteRule Ersatz. Siehe dieEnde meiner AntwortAndiese StackOverflow-Fragefür eine Erklärung.

Zusammenfassung

Options +FollowSymlinks
RewriteEngine On

# Block hidden directories
RewriteRule ^\. - [F]

# Only applies to direct requests (not rewritten requests)
RewriteCond {%ENV:REDIRECT_STATUS} ^$

# Prevent /health_check.php from using https
RewriteCond %{REQUEST_URI} !health_check\.php$

# Prevent /sns from using https but this DOES need codeigniter rewriting (see below)
RewriteCond %{REQUEST_URI} !^/sns/?$

# Reroute http to https
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# Prevent rewriting of domain for codeigniter
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L,QSA]

Die Weiterleitung von HTTP zu HTTPS sollte letztendlich eine 301-Weiterleitung (permanent) sein, aber erst, wenn Sie bestätigt haben, dass sie ordnungsgemäß funktioniert. Das RFlag selbst ist standardmäßig eine 302-Weiterleitung (temporär).

(Sie benötigen den <IfModule>Wrapper auch nicht, es sei denn, Ihre Site soll ohne mod_rewrite funktionieren?)

verwandte Informationen