правила mod_rewrite для всех веб-документов

Мне нужны правила и условия перезаписи, чтобы вызвать центральный PHP-скрипт для каждого и любого веб-документа, запрошенного на моем сервере. Просто добавлю, что я не хочу, чтобы PHP-скрипт вызывался при запросах для CSS, JS, PNG, GIF, JPG и других медиа и т. д. Я хочу, чтобы скрипт вызывался только для документов HTM, HTML и PHP в корень и в любом каталоге или подкаталоге.

Основная проблема, с которой я сталкиваюсь, заключается в том, что я не могу вызвать скрипт для любого из предполагаемых индексов каталогов. Вот что я получаю:

  • http://sampleDomain.com/test/index.html (следует RewriteRule и вызывает myScript .php)
  • sampleDomain.com/test/test.html (следует RewriteRule и вызывает myScript.php)
  • sampleDomain.com/test/ (не соответствует RewriteRule — отображает список каталогов)
  • sampleDomain.com/test (не соответствует RewriteRule — отображает список каталогов)

Вот мои директивы:

  • RewriteEngine включен
  • RewriteCond %{REQUEST_FILENAME} !-f [NC,OR]
  • RewriteCond %{REQUEST_FILENAME} !-d [NC]
  • Правило перезаписи. /phpDir/myScript.php [L]

Как выглядят RewriteRule и RewriteCond, чтобы каждый/любой веб-документ вызывал myScript.php?

Спасибо.


person H. Ferrence    schedule 23.11.2009    source источник


Ответы (2)


Попробуйте это для размера:

DirectoryIndex /phpDir/myScript.php

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !phpDir/myScript.php [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)\.(php|html|htm)$ /phpDir/myScript.php [L]

Разрушая это

DirectoryIndex /phpDir/myScript.php

Устанавливает файл каталога по умолчанию в качестве файла вашего скрипта. Поэтому, если вы входите в папку, в которой нет индексного файла, используйте /phpDir/myScript.php

RewriteCond %{REQUEST_FILENAME} !phpDir/myScript.php [NC]

Проверяет, не запрашиваете ли вы ваш центральный PHP-скрипт. В противном случае вы можете оказаться в бесконечной петле.

RewriteCond %{REQUEST_FILENAME} !-f

Убедитесь, что запрашиваемый вами файл уже не существует. Если вы хотите иметь другие файлы вместо того, чтобы помещать все в свой центральный скрипт.

RewriteRule ^(.*)\.(php|html|htm)$ /phpDir/myScript.php [L]

Это последнее правило проверяет, имеет ли запрошенный файл одно из расширений файла (в данном случае .php, .htm или .html), и если это так, передает его центральному сценарию PHP. Это оставит в покое другие файлы, такие как графика, CSS и другие медиафайлы.

person random    schedule 24.11.2009
comment
Спасибо Кризис идентичности. Я попробовал это в файле .htaccess в одном каталоге на моем сервере, и это сработало. Мне нужно выполнить некоторую очистку всего сервера, прежде чем я смогу поместить это в свой файл httpd.conf и попробовать на всем сервере, но решение и ваши пошаговые объяснения - это действительно помогает. К вашему сведению... Однако я получил предупреждающее сообщение: [Вт, 24 ноября, 07:50:10 2009] [предупреждение] RewriteCond: параметр NoCase для нерегулярного выражения '-f' не поддерживается и будет игнорироваться. Поэтому я удаляю параметр [NC] из строки, на которую ссылается RewriteCond. - person H. Ferrence; 24.11.2009
comment
Спасибо, полностью пропустил предупреждение о том, что NC находится прямо в журнале ошибок. Отредактировано, чтобы очистить/удалить. - person random; 24.11.2009

Нашел это путем постоянного поиска и тестирования:

RewriteEngine on
RewriteRule ^(.*)$ /phpDir/myScript.php [L]

person H. Ferrence    schedule 23.11.2009