, у меня будет стек 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) если имя файла НЕ содержит точки, перенаправить запрос к [filename] .php
В остальном, ваше понимание директив mod_rewrite в значительной степени правильное, за исключением того, что порядок обратный (сначала обрабатывается шаблон RewriteRule
). ..
.php
. RewriteRule ^ ([^ \.] +) $ $ 1.php [N C, L]
Нет необходимости экранировать буквальную точку в классе символов, и флаг NC
здесь лишний.