Конфликт RewriteRule и завершающий слеш

Конфликт RewriteRule и завершающий слеш

Мы переносим сайт в нашу инфраструктуру cPanel. Клиент разместил сайт на своей собственной инфраструктуре с помощью Nginx. Он отправил нам свои файлы конфигурации Nginx, и мы преобразовали их в правила Apache Rewrite. Окончательный результат (показывающий только соответствующие строки) выглядит так:

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]

Все работает как и ожидалось, за исключением одной страницы, которая является /ouvidoria. Эта конкретная страница имеет каталог с тем же именем на public_html, поэтому RewriteRule указывает на ouvidoria/index.phpфайл. Проблема в том, что по какой-то причине при доступе к /ouvidoriaURL мы перенаправляемся на /ouvidoria/?id=ouvidoria, который, похоже, попадает под предпоследнее правило. Так что это первая проблема, которую нужно решить.

Во-вторых, мы можем получить доступ к URL с косой чертой в конце ( /ouvidoria/), и он не будет добавлять ?id=ouvidoria, но веб-сайт был разработан таким образом, что боковое меню загружается в соответствии с URL. Оно будет загружаться только без косой черты в конце. Даже если мы удалим проблемное правило из первой проблемы (что не является решением, так как оно необходимо на других страницах), оно перенаправляет /ouvidoriaна /ouvidoria/, таким образом не загружая меню.

Мы будем признательны за любую помощь в реализации этих правил.

РЕДАКТИРОВАТЬ:

Единственная проблема, которая осталась — это перенаправление с /ouvidoriaна /ouvidoria/. Скриншот вкладки «Сеть»:

Вкладка «Сеть»

Подробности перенаправления:

Подробности перенаправления

решение1

Обновленный ответ для решения проблемы «перенаправления в подкаталог». Попробуйте следующий набор директив:

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]

Удалив RewriteCond %{REQUEST_FILENAME} !-d, Apache не проверяет, существует ли каталог с запрошенным ресурсом. Это может помочь решить вашу проблему.


Оригинальный ответ:

Прошло уже некоторое время с тех пор, как я работал с правилами Apache, но я думаю, что следующее изменение поможет вам достичь вашей цели:

Заменять

RewriteRule ^ouvidoria/$ /ouvidoria/index.php

с

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

Первоначальная версия правила соответствует только /ouvidoria/URI. Поэтому запрос достигает второго RewriteRule, что вызывает поведение, подобное описанному вами.

Исправленная версия правила соответствует как , так /ouvidoria/и /ouvidoria.

решение2

Ну, по какой-то причине директива DirectorySlash Offтеперь работает. Я уже пытался отключить ее раньше, но это приводило к ошибке 500. Я переписывал эти правила много раз, возможно, я удалил то, что конфликтует с DirectorySlash, и теперь эта директива работает так, как и ожидалось.

Также спасибо @Tero Kilkanen за помощь в решении первой проблемы.

Связанный контент