Добавьте следующее к /modrewrite-test/.htaccess
:
RewriteBase /modrewrite-test
Чтобы быть в безопасности, я бы добавил это правило также к /modrewrite-test/public_html/.htaccess
.Я обнаружил, что установка RewriteBase всегда предотвращает множество потенциальных проблем в будущем.Это, однако, означает, что вам может потребоваться обновить значения, если вы измените структуру URI вашего сайта.
Обновление: Я не думаю, что это возможно с вашей текущей структурой папок.Я полагаю, что проблема в том, что существующие подкаталоги предотвращают срабатывание правил перезаписи.Обратите внимание на поведение - все работает нормально, пока вы работаете с несуществующими файлами и каталогами, благодаря следующим двум условиям:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
Однако, если вы пытаетесь открыть любой индексный файл из существующего подкаталога, выполучить перенаправление на .../public_html/...
.Поскольку вы можете правильно открыть /modrewrite-test/cms/navigation/edit.php
, я могу только предположить, что запрос перезаписывается какой-то основной директивой Apache, которая добавляет косую черту в конце URL-адреса папки.Обратите внимание, что все работает нормально, если у вас есть конечная косая черта в каждом URL-адресе (т. Е. Основной каталог Apache не должен «исправлять» ваш URL-адрес, поэтому все переписывается по вашим собственным правилам перезаписи).
Предлагаемое решение (если никто не может посоветовать лучше):
Измените /modrewrite-test/public_html/.htaccess
следующим образом:
RewriteEngine On
RewriteBase /modrewrite-test
# Page (if not a file/directory)
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ page.php?url=$1 [L]
Затем удалите все PHP-файлы из подпапок и используйте шаблон Front Controller , то есть направьте все запросы через ваш основной page.php
и не делегируйте ничего ниже.
Затем можно использовать Заводской шаблон для запуска отдельных пользовательских интерфейсов (т. Е. navigation/edit.php
) непосредственно из основного файла page.php
на основесодержимое $ _GET ['url'] (убедитесь, что правильно его очистили).
Обновление № 2: Этот другой пост в StackOverflow содержит рекомендации по структуре проекта, используемой Zend Framework - в сущности, он демонстрирует подход, который я предложил выше.Это ценный информационный ресурс независимо от того, используете вы Zend Framework или нет.