DocumentRoot "/var/www/html/"
ErrorDocument 404 "/404.php"
Это выглядит правильно. Если документ с ошибкой 404 находится в /var/www/html/404.php
, то нет очевидной причины (из предоставленной информации), почему это не работает, как предполагалось. Он не является содержимым файла .htaccess
- хотя вы можете попробовать альтернативный подход (см. Ниже).
Путь к директиве ErrorDocument
должен быть документом - root -относительный URL-путь - начиная с sla sh. (Чтобы вызвать внутренний подзапрос к соответствующему документу об ошибке.)
Я даже пытался добавить ErrorDocument непосредственно в настройки virtualHost
Однако, если вы используете контейнеры VirtualHost, тогда эти настройки должны быть в соответствующих vHost (s). Все, что находится в vHost, переопределит конфигурацию основного сервера.
Очевидно, что если вы внесете какие-либо изменения в конфигурацию сервера / virtualhost, вам потребуется перезапустить Apache.
Поскольку вы в любом случае, используя .htaccess
, вы также можете установить ErrorDocument
в .htaccess
- и это, в свою очередь, переопределит конфигурацию виртуального хоста / сервера.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^\.]+)$ $1\.php [NC,L]
Ничего особенно плохого с этим ... вы соответствуете запрошенному URL-пути, который не содержит точку, и, если он еще не сопоставлен с файлом или каталогом, вы добавляете расширение .php
.
Просто некоторые примечания относительно этого:
Вы добавляете расширение .php
независимо от того, какой файл "с расширением .php
" действительно существует. Это не обязательно неправильно, просто 404 запускается на /does-not-exist.php
вместо /does-not-exist
. Вместо этого вы можете проверить, существует ли файл назначения. Это позволит избежать необходимости проверять, что запрос еще не сопоставлен с файлом или каталогом.
Первое условие, которое проверяет, что запрос не сопоставляется с файлом, возможно, является ненужным, если только у вас есть файлы, которые не имеют расширений (очень маловероятно, я бы подумал).
[^\.]
- нет необходимости backsla sh экранировать буквальную точку в регулярном выражении класс персонажей. (Хотя в этом нет никакого вреда, кроме читабельности ИМО.)
$1\.php
- нет необходимости в обратном слэсе sh экранировать буквальную точку в RewriteRule
замена . Этот аргумент является «обычной» строкой (не регулярное выражение), точка здесь не несет особого значения. (Хотя, опять-таки, в этом нет никакого вреда, кроме читабельности.)
Флаг NC
на RewriteRule
здесь не требуется, так как вы соответствуете everything за исключением точки в регулярном выражении, которая, естественно, в любом случае включает как прописные, так и строчные буквы.
Если это все, что вы используете для mod_rewrite, то вместо этого вы можете использовать MultiViews для обработки ваших расширений без расширений URL-адрес. Это то, что делает MultiViews (часть mod_negotiation). Учитывая запрос на /path/to/foo
, если /path/to/foo.php
существует, mod_negotiation будет обслуживать этот файл. Вам нужно будет удалить существующие директивы mod_rewrite (поскольку они будут эффективно конфликтовать и игнорироваться в любом случае), а затем включить MultiViews в верхней части вашего .htaccess
файла:
Options +MultiViews
В качестве альтернативы попробуйте следующее, принимая во внимание приведенные выше замечания:
RewriteEngine On
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^([^.]+)$ $1.php [L]
Примечание: я предполагаю, что ваш файл .htaccess
находится в документе root, ie. /var/www/html/.htaccess