23

Так что я знаю, это может показаться немного странным, но я ради последовательности, я бы хотел, чтобы все мои URL-адреса отображались в этой форме: http://domain.com/page/ До сих пор я работал с обычными страницами, но я не могут заставить страницы ошибок работать исправно.Переписать URL-адрес после перенаправления 404-ошибок htaccess

Если пользователь посещает страницу или каталог, который не существует, я бы хотел, чтобы браузер перенаправлял на: http://domain.com/404/ Этот каталог, однако, на самом деле не существует. Реальное местоположение страницы с ошибкой будет находиться под /pages/errors/404.php

Кроме того, хотя мне не нужен точный ответ для всех различных ошибок (400, 401, 403, 404, 500), I будет применять любой метод, чтобы перенаправить все это на их «правильные» URL-адреса (например, http://domain.com/400/http://domain.com/500/ и т. д.)

Любые идеи?

ответ

38

Попробуйте это в .htaccess:

.htaccess

ErrorDocument 404 http://example.com/404/ 
ErrorDocument 500 http://example.com/500/ 
# or map them to one error document: 
# ErrorDocument 404 /pages/errors/error_redirect.php 
# ErrorDocument 500 /pages/errors/error_redirect.php 

RewriteEngine On 
RewriteBase/

RewriteCond %{REQUEST_URI} ^/404/$ 
RewriteRule ^(.*)$ /pages/errors/404.php [L] 

RewriteCond %{REQUEST_URI} ^/500/$ 
RewriteRule ^(.*)$ /pages/errors/500.php [L] 

# or map them to one error document: 
#RewriteCond %{REQUEST_URI} ^/404/$ [OR] 
#RewriteCond %{REQUEST_URI} ^/500/$ 
#RewriteRule ^(.*)$ /pages/errors/error_redirect.php [L] 

ErrorDocument перенаправляет все 404s на определенный URL-адрес, все 500s на другой URL-адрес (замените ваш домен).

Правила перезаписи сопоставляют этот URL с вашим фактическим скриптом 404.php. Регулярные выражения RewriteCond могут быть сделаны более универсальными, если вы хотите, но я думаю, вам нужно явно определить все коды ErrorDocument, которые вы хотите переопределить.

Местный Перенаправление:

Change .htaccess ErrorDocument в файл, который существует (должен существовать, или вы получите сообщение об ошибке):

ErrorDocument 404 /pages/errors/404_redirect.php 

404_redirect.php

<?php 
    header('Location: /404/'); 
    exit; 
?> 

Переадресация на основе номера ошибки

Похоже, вам нужно указать ErrorDocument строку в .htaccess для каждой ошибки вы хотите переадресовать (см Apache ErrorDocument и Apache Custom Error). Пример .htaccess, приведенный выше, содержит несколько примеров. Вы можете использовать следующее как общий сценарий перенаправления для замены 404_redirect.php выше.

error_redirect.PHP

<?php 
    $error_url = $_SERVER["REDIRECT_STATUS"] . '/'; 
    $error_path = $error_url . '.php'; 

    if (! file_exists($error_path)) { 
     // this is the default error if a specific error page is not found 
     $error_url = '404/'; 
    } 

    header('Location: ' . $error_url); 
    exit; 
?> 
+0

Именно то, что я ищу ... но все равно использовать относительный путь в объявлении ErrorDocument? –

+0

Если вы используете относительный путь, вам нужно указать на существующий файл, и этот файл может затем перенаправить на несуществующий/404/url. Редактирование моего ответа, чтобы показать это сейчас ... – Jay

+0

Могу ли я иметь только один файл, который перенаправляет на любую ошибку? Используя запрос url или что-то еще? –

1

Попробуйте добавить это правило к верхней вашего HTAccess:

RewriteEngine On 
RewriteRule ^404/?$ /pages/errors/404.php [L] 

Тогда под этим (или любые другие правила, которые у вас есть):

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-l 
RewriteRule^http://domain.com/404/ [L,R] 
+0

Благодарим вас за ответ, но это не сработает с другими форматами ошибок, такими как 401 и 500, насколько я могу судить ... –

7

Put этот код в вашем файле .htaccess

RewriteEngine On 
ErrorDocument 404 /404.php 

где 404.php - это имя файла и помещено в корень. Здесь вы можете положить полный путь.

Смежные вопросы