Назад | Перейти на главную страницу

Файл .htaccess перенаправляет не в тот пункт назначения

У меня есть стек 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 шаблон обрабатывается первым) ...

  1. Если URL-адрес (весь URL-адрес) не содержит точки.
  2. И запрос не сопоставляется с действительным файлом (маловероятно, если все ваши файлы имеют расширения файлов, поэтому это условие, возможно, можно пропустить).
  3. Перепишите запрос внутри себя, добавив .php расширение.
RewriteRule ^([^\.]+)$ $1.php [NC,L]

Нет необходимости экранировать буквальную точку в классе символов, и NC флаг здесь лишний.