Вам не нужен RewriteRule для достижения этой цели.
Просто используйте директиву ErrorDocument
.
Он будет обслуживать страницу, на которую вы ссылаетесь, но НЕ будет перенаправлять на нее.
Если ваша ErrorDocument
страница представляет собой php-скрипт, вы можете получить доступ к $_SERVER['REQUEST_URI']
, чтобы узнать, какой ресурс был найден.
Итак, в основном вам нужно это в вашем файле .htaccess
:
ErrorDocument 404 /error.php
А в error.php
:
$notFound = $_SERVER['REQUEST_URI'];
Или любую переменную, в которой вы хотите сохранить этот URI.
Хорошо, что, поскольку пользователь не перенаправлен на страницу, простую опечатку легко исправить, чтобы перейти на нужную страницу, тогда как перенаправление заставит пользователя снова ввести весь URL-адрес (также он / она не сможет увидеть, что он / она пытался получить доступ).
С точки зрения аналитики, это все равно 404 без какого-либо дополнительного кода.
Перенаправление на страницу с ошибкой вынудит вас добавить к ней дополнительный заголовок 404 (чтобы роботы не индексировали вашу страницу с ошибкой, между прочим).
В error.php
убедитесь, что все пути ваших активов являются абсолютными, так как он может быть доставлен из http://www.example.com/xxx/yyy
и будет искать относительные активы из /xxx/
(этот путь может не существовать). Таким образом, даже если error.php
находится в корневой папке, использование src="img/404.png"
не будет работать, как только у 404 будет папка в своем URI. Вы должны использовать src="/img/404.png"
.