Как настроить Apache для обслуживания 404 для отсутствующих медиа-файлов, но передавать другие URL-адреса в приложение - PullRequest
0 голосов
/ 14 февраля 2020

У меня есть приложение Vue JS со стандартным правилом Apache, позволяющим передавать URL-адреса SEO или пути "HTML5 History Mode" в маршрутизатор приложения. Он обслуживает реальные существующие файлы напрямую и обращается к приложению для любых других путей, которые могут привести к 404. Поэтому все 404 сожрены приложением.

У меня есть папка мультимедиа, и если у меня есть Отсутствующее изображение или аудиофайл. К сожалению, файл 404 для этого файла также передается в маршрутизатор приложения, который сам не знает, что делать с медиа-путем.

Текущая конфигурация Apache:

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule . /index.html [L]
</IfModule>

Моя структура папок выглядит следующим образом:

index.html
media/images/file1.jpg
media/images/file2.jpg
media/images/file4.jpg         <--- oops missing 3.jpg
media/audio/etc

В настоящее время, если вы нажмете media/images/file3.jpg, вы получите ответ HTTP 200 и страницу приложения по умолчанию / 404 в HTML. Очевидно, что это не то, что браузер ожидает при рендеринге изображения.

Я хочу сказать Apache:

  1. Если это реальный файл, затем подайте его напрямую
  2. Если он находится на носителе / ​​и отсутствует, тогда подайте 404
  3. Остальное переписать в индекс. html

Это Шаг 2 Мне нужна конфигурация Apache для.

Что я пробовал

Ссылаясь на https://httpd.apache.org/docs/current/mod/mod_rewrite.html и различные другие вопросы например, этот .

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

  RewriteCond %{REQUEST_URI} !^/media
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule . /index.html [L]

И это теперь возвращает 404 для отсутствующего файла, который является прогрессом, но все же передает обработку приложению и возвращает тело HTML. (Я не совсем понимаю, как это может сделать оба варианта.)

Я также попробовал отдельное правило перед тем, как обрабатывать носитель отдельно, поэтому выполняется на 200 или 404 - правило «не переписывать».

  RewriteRule ^/media(.*) - [L]
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule . /index.html [L]

Но, похоже, это ничего не дало, и я вернулся к ответу 200 и телу приложения.

...