htaccess физически перенаправить в случае 404 - PullRequest
0 голосов
/ 21 февраля 2012

Для начала я знаю, как сделать простое перенаправление на 404, когда страница не существует.

ErrorDocument 404 /index.php

Это то, что я хочу сделать, это физическое перенаправление на страницу индекса. Таким образом, если пользователь вводит mydomain.com/abc, и эта страница не существует, он выполняет фактическое перенаправление на страницу индекса. Я не хочу, чтобы URL оставался прежним с плохим адресом. Да, я знаю, это не имеет большого значения, но это меня беспокоит. Я мог бы добиться этого, если бы пользователь перенаправлял страницу 404 на домашнюю страницу, но я этого не хочу.

Я пробовал это с флагом перенаправления [R], и, очевидно, он не работает.

Options -MultiViews
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)$ $1.php [L]
RewriteRule ^(.*)$ /index.php [L,R]

Обновление

Это ошибка, которую я получаю, она переписывает URL на mydomain.com/index.php

Я попытался удалить index.php с помощью /, и он не перенаправил, но выдал ту же ошибку ниже.

The page isn't redirecting properly         

Firefox has detected that the server is redirecting the request for this address in a way that will never complete.

This problem can sometimes be caused by disabling or refusing to accept
cookies.

Ответы [ 2 ]

3 голосов
/ 21 февраля 2012

Сделайте это:

RewriteEngine on
RewriteBase /

RewriteCond %{REQUEST_URI} !(?:\.\w+)$ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ([^/]+)/?$ $1.php 

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ / [L,R]

Объяснение:

проверяет, имеет ли расширение файла:

RewriteCond %{REQUEST_URI} !(?:\.\w+)$ [NC]

Если нетпроверяет, присутствует ли файл:

RewriteCond %{REQUEST_FILENAME} !-f

Если это не файл, проверяется, присутствует ли эта папка:

RewriteCond %{REQUEST_FILENAME} !-d

Если нет, добавьте .php.Если / присутствует в конце, удалите его и добавьте .php

RewriteRule ([^/]+)/?$ $1.php 

Проверяет, является ли добавленный .php или любой другой файл расширения фактически файлом, который присутствует:

RewriteCond %{REQUEST_FILENAME} !-f

проверьте, является ли это каталогом:

RewriteCond %{REQUEST_FILENAME} !-d

Если нет, то это неверный запрос файла и перенаправляет его на / RewriteRule ^ (. *) $ / [L, R]

0 голосов
/ 21 февраля 2012

Это должна быть ваша обработка на основе mod_rewrite 404:

# if it is not a file, directory or link
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^ index.php [L,R]

Однако я не уверен, что вы делаете в своем первом правиле?Вы пытаетесь добавить .php к каждому URI запроса?

...