Я ищу способ настроить httpd сервер на ответ с изображением, если запрошенный файл не найден. Я знаю, что это можно сделать просто:
ErrorDocument 404 "/static/thumbnails/404.png"
Этот вариант работает, но сервер отвечает кодом 404, и это то, от чего я пытаюсь избавиться (в идеале, если сервер будет возвращать 200).
Я попробовал сделать простой редирект следующим образом:
Redirect "for/sure/doesnt/exist" "/static/thumbnails/blank-thumbnail.png"
ErrorDocument 404 "/for/sure/doesnt/exist"
Но это не работает (и даже если бы это работало - он бы вернул 302 ответ), так как это то, что возвращается для GET http://mydomain/static/thumbnails/xxxx.png
:
Not Found The requested URL /static/thumbnails/any was not found on на этом сервере.
Кроме того, была обнаружена ошибка 302 Found при попытке использовать ErrorDocument для обработки запроса.
Что интересно, в журнале Apache указано, что код состояния для этого ответа 302:
[16/Jan/2018:08:39:56 -0500] "GET /static/thumbnails/any HTTP/1.1" 302 - "-" "curl/7.47.0"
Итак, похоже, что Redirect
действительно сработал, но я также уверен, что "/static/thumbnails/blank-thumbnail.png"
путь верен.
Есть ли способ, без скриптов, обслужить определенный статический ресурс (изображение в моем случае), если запрошенный ресурс не найден (вместо возврата 404)?
Возможно решение в этом: https://stackoverflow.com/questions/5190206/how-do-i-redirect-a-url-that-isnt-found-without -sending-a-404-header может вам помочь.
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]
Это перезаписывает все, если это не файл / каталог / ссылка. На последнем шаге можно положить что угодно. И сервер будет обслуживать его как 200.
Похоже, вы пытаетесь делать две противоречащие друг другу вещи. Если запрошенный ресурс не найден, ответ 200 будет ошибочным - 200 означает «все в порядке, я нашел то, что вы искали, и вот оно». Ответ 404 - это правильный ответ, вы хотите просто использовать ErrorDocument, как вы упомянули в самом начале своего сообщения, для обслуживания статического ресурса для чего-либо, что не найдено.