Если 404 надо генерировать именно бекендом, лучше сделать что-то такое (nginx например):
fastcgi_intercept_errors on;
error_page 404 /error_not_found.html;
При этом /error_not_found.html должен отдавать статус 200. Его контент будет поставляться в страницу по ошибочному урлу со статусом 404. Оригинальный урл будет доступен php из REQUEST_URI. При этом в DOCUMENT_URI будет /error_not_found.html.