Как пересылать UDP-пакеты из контейнера Docker на хост 127.0.0.1?

, у меня будет стек 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 существует? Что мне здесь не хватает?

Спасибо!

2
задан 26 May 2017 в 21:50
1 ответ

Если у вас есть несколько файлов с одинаковым базовым именем , то похоже, что вы можете конфликт с MultiViews . Попробуйте отключить это в вашем файле .htaccess (или конфигурации сервера):

Options -MultiViews

MultiViews (часть mod_negotiation) делает то же самое, что вы пытаетесь сделать с mod_rewrite, и я подозреваю, что " победа ". Когда вы запрашиваете / asdf и asdf сопоставляются с базовым именем файла, тогда MultiViews пытается обслужить соответствующий файл, который будет соответствовать предполагаемому типу mime (что может объяснить почему .js файлы пропадают).

Я понимаю набор правил перезаписи так: 1) если запрашиваемый файл не существует ТО 2) если имя файла НЕ содержит точки, перенаправить запрос к [filename] .php

В остальном, ваше понимание директив mod_rewrite в значительной степени правильное, за исключением того, что порядок обратный (сначала обрабатывается шаблон RewriteRule ). ..

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

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

2
ответ дан 3 December 2019 в 11:29

Теги

Похожие вопросы