RewriteRule-Konflikt und abschließender Schrägstrich

RewriteRule-Konflikt und abschließender Schrägstrich

Wir migrieren eine Website auf unsere cPanel-Infrastruktur. Der Kunde hat die Website auf seiner eigenen Infrastruktur mit Nginx gehostet. Er hat uns seine Nginx-Konfigurationsdateien gesendet und wir haben sie in Apache Rewrite-Regeln konvertiert. Das Endergebnis (es werden nur die relevanten Zeilen angezeigt) sieht folgendermaßen aus:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ouvidoria/$ /ouvidoria/index.php
RewriteRule ^([^/\.]+)/?$ index.php?id=$1 [L]
RewriteRule ^news\/(.*)/?$ noticias.php?id=$1 [L]

Alles funktioniert wie erwartet, mit Ausnahme einer Seite, nämlich /ouvidoria. Diese spezielle Seite hat ein Verzeichnis mit demselben Namen auf public_html, sodass die RewriteRule auf die ouvidoria/index.phpDatei verweist. Das Problem ist, dass wir aus irgendeinem Grund beim Zugriff /ouvidoriaauf die URL zu umgeleitet werden /ouvidoria/?id=ouvidoria, was der vorletzten Regel zu entsprechen scheint. Dies ist also das erste zu lösende Problem.

Zweitens können wir auf die URL mit einem abschließenden Schrägstrich ( /ouvidoria/) zugreifen und es wird kein angehängt ?id=ouvidoria, aber die Website wurde so entwickelt, dass das Seitenmenü entsprechend der URL geladen wird. Es wird nur ohne abschließenden Schrägstrich geladen. Selbst wenn wir die problematische Regel aus dem ersten Problem entfernen (was keine Lösung ist, da sie auf anderen Seiten benötigt wird), wird auf umgeleitet /ouvidoria, /ouvidoria/wodurch das Menü nicht geladen wird.

Wir sind für jede Hilfe dankbar, die uns dabei hilft, diese Regeln umzusetzen.

BEARBEITEN:

Das einzige verbleibende Problem ist die Weiterleitung von /ouvidoriazu /ouvidoria/. Screenshot der Registerkarte „Netzwerk“:

Registerkarte „Netzwerk“

Weiterleitungsdetails:

Weiterleitungsdetails

Antwort1

Aktualisierte Antwort zur Behebung des Problems „Umleitung in Unterverzeichnis“. Versuchen Sie es mit den folgenden Anweisungen:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ouvidoria/?$ /ouvidoria/index.php [L]
RewriteRule ^([^/\.]+)/?$ index.php?id=$1 [L]
RewriteRule ^news\/(.*)/?$ noticias.php?id=$1 [L]

Durch das Entfernen des RewriteCond %{REQUEST_FILENAME} !-dprüft Apache nicht, ob ein Verzeichnis mit der angeforderten Ressource vorhanden ist. Dies könnte bei Ihrem Problem helfen.


Ursprüngliche Antwort:

Es ist eine Weile her, seit ich mit Apache-Regeln gearbeitet habe, aber ich denke, die folgende Änderung würde Ihnen helfen, Ihr Ziel zu erreichen:

Ersetzen

RewriteRule ^ouvidoria/$ /ouvidoria/index.php

mit

RewriteRule ^ouvidoria/?$ /ouvidoria/index.php [L]

Die ursprüngliche Version der Regel stimmt nur mit /ouvidoria/der URI überein. Daher erreicht die Anfrage die zweite RewriteRule, was zu dem von Ihnen beschriebenen Verhalten führt.

Die korrigierte Version der Regel trifft sowohl auf /ouvidoria/als auch zu /ouvidoria.

Antwort2

Nun, aus irgendeinem Grund hat die Direktive DirectorySlash Offjetzt funktioniert. Ich habe bereits versucht, sie vorher zu aktivieren, aber es wurde ein Fehler 500 generiert. Ich habe diese Regeln viele Male neu geschrieben, vielleicht habe ich das entfernt, was mit DirectorySlash in Konflikt stand, und jetzt funktioniert diese Direktive wie erwartet.

Vielen Dank auch an @Tero Kilkanen, der mir geholfen hat, das erste Problem zu beheben.

verwandte Informationen