IMHO.WS

IMHO.WS (https://www.imho.ws/index.php)
-   Веб-программирование (https://www.imho.ws/forumdisplay.php?f=29)
-   -   Как инициировать ошибку 404? (https://www.imho.ws/showthread.php?t=105419)

Self Author 27.06.2006 16:33

Как инициировать ошибку 404?
 
Помогите придумать:
Как можно заставить апач отработать условие в htaccess по обработке ошибки 404, если вызван файл, который реально существует?

Т.е. есть некий адрес http://server.ru/folder/ там реально лежит файл index.php, который работает, проверяет какие-то условия и при определённых условиях должна показаться заранее сделанная страница об ошибке 404. Причём редиректить на эту страницу не пойдёт: в строке адреса должен остаться тот адрес, что набрали. Этот редирект должен сделать апач, согласно своим правилам.

RaZEr 27.06.2006 16:44

Любое правило изначально работает для всех файлов, независимо от их существования. А если очень хочется задействовать ErrorDocument, то можно написать реврайт на заведомо несуществующий файл.

Self Author 27.06.2006 17:00

Тогда в строке адреса будет торчать этот несуществующий файл...

Madness 27.06.2006 17:15

Self Author
>Тогда в строке адреса будет торчать этот несуществующий файл...
RaZEr грит про реврайт, а не редирект.
А еще тут глянь: http://ru.php.net/header (про 404 там есть)

Self Author 27.06.2006 17:26

Цитата:

Madness:
RaZEr грит про реврайт, а не редирект.
А еще тут глянь: http://ru.php.net/header (про 404 там есть)
Про реврайт не знаю ничего. Где об этом можно посмотреть?
А ссылка не открывается...

Madness 27.06.2006 17:34

Self Author
>Про реврайт не знаю ничего. Где об этом можно посмотреть?
Да ладно, а это чья тема?

>А ссылка не открывается...
Зайди на php.net и в поиске набери header.

Self Author 27.06.2006 18:12

Цитата:

Madness:
Да ладно, а это чья тема?
Тьфу! Блин...
Я думал что другое...
Так как этот реврайт мне поможет? Откуда htaccess узнает, что какой-то скрипт решил закосить под несуществующий?

Madness 28.06.2006 00:40

Self Author
>Откуда htaccess узнает, что какой-то скрипт решил закосить под несуществующий?
Тогда сам скрипт пусть думает косить ему иль нет => http://ru.php.net/header

Self Author 28.06.2006 00:59

Цитата:

Madness:
Тогда сам скрипт пусть думает косить ему иль нет => http://ru.php.net/header
Хидеры дают команду браузеру, а не апачу. Апач соединил браузер со скриптом, и ему наплевать, что там между ними происходит. Скрипт сообщает браузеру заголовки, и уже браузер нарисует свою страницу 404.

Madness 28.06.2006 10:09

Self Author
Я вот не пойму, а что мешает скрипту нарисовать свою страницу 404?

Self Author 28.06.2006 11:49

Всё дело в "цене" вопроса. Есть вариант: редирект на некий nopage.htm, после которого будет показана страница 404. Минус - светится этот nopage.htm. А теперь, чтобы от этого избавится, нужно что-то сделать. И чем больше всего надо делать, тем "дороже" становится это решение. Скрипты анализируют URI, которым были вызваны, от этого показывают что-то по-разному. И это получается как бы "правило". Для того, чтобы каждый из этих скриптов мог сделать свою страницу 404, нужно писать "исключение", соизмеримое с этими правилами. А это делать не хочется.

Спасибо всем, кто предлагал решения. Жаль, что "красивого" решения нет.

Hubbitus 11.07.2006 10:43

Может так:
.htaccess:
Код:

ErrorDocument 404 /404_err.php
В index.php:
Код:

<?
//Какие-то проверки, и если решили что надо 404 ошибку:
header("HTTP/1.0 404 Not Found");
virtual('404_err.php');
?>


Self Author 11.07.2006 12:00

Hubbitus!
Header - это сообщение от сервера браузеру. А мне нужно, чтобы сервер повёл себя так, будто файла нет.

Madness 11.07.2006 13:24

Self Author
Объясни, пожалста, внятно и понятно что нужно и чем тебя не устраивают вышеописанные варианты.

Hubbitus 12.07.2006 10:31

Цитата:

Self Author:
Header - это сообщение от сервера браузеру.
Естественно. Только не браузеру, а вообще, любому клиенту.

Цитата:

Self Author:
А мне нужно, чтобы сервер повёл себя так, будто файла нет.
Ну мой пример это и эмулирует.

Sam Dark 12.07.2006 12:56

Self Author
Допустим, у нас есть вот такая запись в нашем htaccess:
ErrorDocument 404 /error.php

Первой строкой в error.php отдаём заголовок (как уже писал Hubbitus):
header("HTTP/1.0 404 Not Found");

Далее выводим сообщение аля страница не найдена.

Теперь дописываем rewrite-ы:
RewriteEngine on
RewriteRule урл_для_404 /error.php

Goryn 13.07.2006 09:59

Цитата:

Сообщение от Sam Dark
Теперь дописываем rewrite-ы:
RewriteEngine on
RewriteRule урл_для_404 /error.php

Честно говоря ща сам хотел предложить вариант с ModRewrite

Hubbitus 13.07.2006 10:23

Sam Dark, чего-то я тебя не понял. Ну выдали мы 404 из скрипта, дальше-то что? Реврайты твои не сработают же, потому как скрипт запущен index.php, и он выдаст браузеру именно то что в нем напишешь, после этого заголовка.

Как вариант с реврайтом, можно вместо вызова virtual в моем примере, сделать попробовать переадресацию на какой-то несуществующий элемент, и его уже реврайтом перезаписать по желанию.

Self Author 13.07.2006 11:41

Цитата:

Sam Dark:
Теперь дописываем rewrite-ы:
RewriteEngine on
RewriteRule урл_для_404 /error.php
А я разве могу динамически править или генерировать скриптом htaccess? Ведь мне сейчас этот урл надо скрывать, а через 5 минут уже не надо...

RaZEr 13.07.2006 11:47

Цитата:

А я разве могу динамически править или генерировать скриптом htaccess?
Почему нет? Или RewriteMap CGI.

Self Author 13.07.2006 12:02

Цитата:

RaZEr:
Или RewriteMap CGI.
Что-то не совсем понял... Это перлом только можно делать? PHP нельзя?

Sam Dark 17.07.2006 09:49

А почему нет? Я пробовал править htaccess на ходу скриптом - всё в норме. Если надо - поделюсь классом для этого дела.

Self Author 17.07.2006 12:55

Цитата:

Сообщение от Sam Dark
А почему нет? Я пробовал править htaccess на ходу скриптом - всё в норме. Если надо - поделюсь классом для этого дела.

Не надо. Я принцип понял. Просто я думал, что можно вообще htaccess выдавать динамически скриптом.
У меня другой вопрос:
Вот я подправил htaccess в тот момент, когда мне это потребовалось.
1. Как теперь заставить, чтобы это вступило в силу? Перезапустить скрипт хидером?
2. Всё отработалось, апач сделал своё дело. Как потом заставить какой-нибудь скрипт вернуть старый htaccess нлазад? Или Вы делали постоянные изменения, не временные?

Sam Dark 17.07.2006 13:22

Вообще я делал постоянные изменения.

Почитал ещё пару раз первый пост. Думаю, что про редиректы и mod_rewrite всё немного сложно...

Лучше сделать что-то вроде:
PHP код:

if (!$error404){
  
//выполняем скрипт
}
else{
  
//заголовок 404-ой
  
header("HTTP/1.0 404 Not Found");
  
//вызываем предопределённую функцию
  //ей же пользуемся при реальных 404-ошибках
  
require_once('error.php');
  
printError404();




Часовой пояс GMT +4, время: 07:32.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.