Здесь есть две проблемы, которые, вероятно, способствуют вашим неприятностям. Во-первых, вы не можете так легко проверить существование файла в контексте сервера (как в случае с httpd.conf), поскольку запрос еще не был сопоставлен с файловой системой.
Если ваши запросы на статические ресурсы оказываются непосредственно соответствующими структуре вашей файловой системы за пределами DOCUMENT_ROOT, вы можете решить эту проблему, добавив значение DOCUMENT_ROOT перед входящим REQUEST_URI, как показано ниже:
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d
Если путь к вашим статическим ресурсам преобразуется где-то вниз по линии, в документации mod_rewrite предлагается использовать следующее, что выдаст подзапрос для выполнения просмотра на основе URI запроса:
RewriteCond %{LA-U:REQUEST_FILENAME} !-f
RewriteCond %{LA-U:REQUEST_FILENAME} !-d
Однако этот подход более дорогой, поэтому попробуйте использовать первый, где это возможно.
Во-вторых, URI, который вы передаете обратно в запрос, на самом деле недействителен, поскольку для него требуется начальная косая черта. Исправляя это и комбинируя его с новыми условиями, приведенными выше, вы получаете этот измененный набор правил:
RewriteEngine On
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d
RewriteRule ^.*$ /index.php?page=$0 [PT,QSA,L]
Обратите внимание, что здесь значение page
всегда будет иметь начальную косую черту, поэтому вы можете вместо этого использовать это правило, в зависимости от вашей логики обработки в index.php:
RewriteRule ^/(.*)$ /index.php?page=$1 [PT,QSA,L]