У меня есть стек LAMP. Я использую следующий файл .htaccess для автоматического сопоставления запросов с файлами .php:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]
Итак, если я перейду к http://example.com/asdf будет загружен файл "asdf.php".
Однако, если я создаю файл .css с тем же именем (например, «asdf.css»), то сервер возвращает файл css вместо файла PHP при переходе к имени без расширения. Также, похоже, происходит с расширениями файлов .txt и, вероятно, с любым другим трехсимвольным расширением (хотя НЕ происходит для файлов .js).
Я не могу понять, почему это происходит. Насколько я понимаю, набор правил перезаписи таков: 1) если запрашиваемый файл не существует, ТО 2) если имя файла НЕ содержит точки, перенаправить запрос на [имя файла] .php
Как это может вернуть файл .txt или .css, особенно если существует соответствующий файл .php? Что мне здесь не хватает?
Спасибо!
Если у вас есть несколько файлов с одинаковым базовое имя, значит, у вас может быть конфликт с MultiViews
. Попробуйте отключить это в своем .htaccess
файл (или конфигурацию сервера):
Options -MultiViews
MultiViews
(часть mod_negotiation) делает то же самое, что вы пытаетесь сделать с mod_rewrite, и я подозреваю, что это "выигрыш". Когда вы просите /asdf
и asdf
сопоставляется с базовым именем файла, затем MultiViews
пытается предоставить соответствующий файл, соответствующий предполагаемому типу MIME (что может объяснить, почему .js
файлы пропускаются).
Я понимаю набор правил перезаписи: 1) если запрашиваемый файл не существует ТО 2) если имя файла НЕ содержит точки, перенаправить запрос на [имя файла] .php
В противном случае ваше понимание директив mod_rewrite в значительной степени правильное, за исключением того, что порядок обратный ( RewriteRule
шаблон обрабатывается первым) ...
.php
расширение.RewriteRule ^([^\.]+)$ $1.php [NC,L]
Нет необходимости экранировать буквальную точку в классе символов, и NC
флаг здесь лишний.