Мы переносим сайт в нашу инфраструктуру 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
файл. Проблема в том, что по какой-то причине при доступе к /ouvidoria
URL мы перенаправляемся на /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 за помощь в решении первой проблемы.