Тема: Ошибка 404

Вчера сделала сайт. На главной странице всё ок, но при переходе по внутренним ссылкам сайта выдаёт ошибку 404. Грешу на .htaccess. Помогите, пожалуйста...

http://сайт.ру/addnews.html - не работает
http://сайт.ру/index.php?do=addnews - работает

DirectoryIndex index.php

RewriteEngine On

# Редиректы
RewriteRule ^page/(.*)$ index.php?cstart=$1 [L]

# Сам пост
RewriteRule ^([0-9]{4})/([0-9]{2})/([0-9]{2})/page,([0-9]+),([0-9]+),(.*).html(/?)+$ index.php?subaction=showfull&year=$1&month=$2&day=$3&news_page=$4&cstart=$5&news_name=$6 [L]
RewriteRule ^([0-9]{4})/([0-9]{2})/([0-9]{2})/page,([0-9]+),(.*).html(/?)+$ index.php?subaction=showfull&year=$1&month=$2&day=$3&news_page=$4&news_name=$5 [L]
RewriteRule ^([0-9]{4})/([0-9]{2})/([0-9]{2})/print:page,([0-9]+),(.*).html(/?)+$ engine/print.php?subaction=showfull&year=$1&month=$2&day=$3&news_page=$4&news_name=$5 [L]
RewriteRule ^([0-9]{4})/([0-9]{2})/([0-9]{2})/(.*).html(/?)+$ index.php?subaction=showfull&year=$1&month=$2&day=$3&news_name=$4 [L]

RewriteRule ^([^.]+)/page,([0-9]+),([0-9]+),([0-9]+)-(.*).html(/?)+$ index.php?newsid=$4&news_page=$2&cstart=$3 [L]
RewriteRule ^([^.]+)/page,([0-9]+),([0-9]+)-(.*).html(/?)+$ index.php?newsid=$3&news_page=$2 [L]
RewriteRule ^([^.]+)/print:page,([0-9]+),([0-9]+)-(.*).html(/?)+$ engine/print.php?news_page=$2&newsid=$3 [L]
RewriteRule ^([^.]+)/([0-9]+)-(.*).html(/?)+$ index.php?newsid=$2 [L]

RewriteRule ^page,([0-9]+),([0-9]+),([0-9]+)-(.*).html(/?)+$ index.php?newsid=$3&news_page=$1&cstart=$2 [L]
RewriteRule ^page,([0-9]+),([0-9]+)-(.*).html(/?)+$ index.php?newsid=$2&news_page=$1 [L]
RewriteRule ^print:page,([0-9]+),([0-9]+)-(.*).html(/?)+$ engine/print.php?news_page=$1&newsid=$2 [L]
RewriteRule ^([0-9]+)-(.*).html(/?)+$ index.php?newsid=$1 [L]

# За день
RewriteRule ^([0-9]{4})/([0-9]{2})/([0-9]{2})(/?)+$ index.php?year=$1&month=$2&day=$3 [L]
RewriteRule ^([0-9]{4})/([0-9]{2})/([0-9]{2})/page/([0-9]+)(/?)+$ index.php?year=$1&month=$2&day=$3&cstart=$4 [L]
# За весь месяц
RewriteRule ^([0-9]{4})/([0-9]{2})(/?)+$ index.php?year=$1&month=$2 [L]
RewriteRule ^([0-9]{4})/([0-9]{2})/page/([0-9]+)(/?)+$ index.php?year=$1&month=$2&cstart=$3 [L]
# Вывод за весь год
RewriteRule ^([0-9]{4})(/?)+$ index.php?year=$1 [L]
RewriteRule ^([0-9]{4})/page/([0-9]+)(/?)+$ index.php?year=$1&cstart=$2 [L]
# вывод отдельному тегу
RewriteRule ^tags/([^/]*)(/?)+$ index.php?do=tags&tag=$1 [L]
RewriteRule ^tags/([^/]*)/page/([0-9]+)(/?)+$ index.php?do=tags&tag=$1&cstart=$2 [L]
# вывод для отдельного юзера
RewriteRule ^user/([^/]*)/rss.xml$ engine/rss.php?subaction=allnews&user=$1 [L]
RewriteRule ^user/([^/]*)(/?)+$ index.php?subaction=userinfo&user=$1 [L]
RewriteRule ^user/([^/]*)/page/([0-9]+)(/?)+$ index.php?subaction=userinfo&user=$1&cstart=$2 [L]
RewriteRule ^user/([^/]*)/news(/?)+$ index.php?subaction=allnews&user=$1 [L]
RewriteRule ^user/([^/]*)/news/page/([0-9]+)(/?)+$ index.php?subaction=allnews&user=$1&cstart=$2 [L]
RewriteRule ^user/([^/]*)/news/rss.xml(/?)+$ engine/rss.php?subaction=allnews&user=$1 [L]
# вывод всех последних новостей
RewriteRule ^lastnews/(/?)+$ index.php?do=lastnews [L]
RewriteRule ^lastnews/page/([0-9]+)(/?)+$ index.php?do=lastnews&cstart=$1 [L]
# вывод в виде каталога
RewriteRule ^catalog/([^/]*)/rss.xml$ engine/rss.php?catalog=$1 [L]
RewriteRule ^catalog/([^/]*)(/?)+$ index.php?catalog=$1 [L]
RewriteRule ^catalog/([^/]*)/page/([0-9]+)(/?)+$ index.php?catalog=$1&cstart=$2 [L]
# вывод непрочитанных статей
RewriteRule ^newposts(/?)+$ index.php?subaction=newposts [L]
RewriteRule ^newposts/page/([0-9]+)(/?)+$ index.php?subaction=newposts&cstart=$1 [L]
# Статистические страницы
RewriteRule ^static/(.*).html(/?)+$ index.php?do=static&page=$1 [L]
# вывод избранных статей
RewriteRule ^favorites(/?)+$ index.php?do=favorites [L]
RewriteRule ^favorites/page/([0-9]+)(/?)+$ index.php?do=favorites&cstart=$1 [L]

RewriteRule ^rules.html$ index.php?do=rules [L]
RewriteRule ^statistics.html$ index.php?do=stats [L]
RewriteRule ^addnews.html$ index.php?do=addnews [L]
RewriteRule ^rss.xml$ engine/rss.php [L]
RewriteRule ^sitemap.xml$ uploads/sitemap.xml [L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^.]+)/page/([0-9]+)(/?)+$ index.php?do=cat&category=$1&cstart=$2 [L]
RewriteRule ^([^.]+)/?$ index.php?do=cat&category=$1 [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^.]+)/rss.xml$ engine/rss.php?do=cat&category=$1 [L]
RewriteRule ^page,([0-9]+),([^/]+).html$ index.php?do=static&page=$2&news_page=$1 [L]
RewriteRule ^print:([^/]+).html$ engine/print.php?do=static&page=$1 [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+).html$ index.php?do=static&page=$1 [L]

2

Re: Ошибка 404

Скунса сказал:

http://сайт.ру/addnews.html - не работает
http://сайт.ру/index.php?do=addnews - работает

Конкретно за этот редирект отвечает строка:

RewriteRule ^addnews.html$ index.php?do=addnews [L]

Что вы подразумевали под внутренними ссылками - этого я не понял. Попробуйте привести пример того как есть и как должно быть.

3

Re: Ошибка 404

Под внутренними ссылками подразумевается переход  основной страницы сайта на профиль юзера, на добавление новости. Допустим, как на Вашем сайте работала бы только главная страница, а при переходе на Пользователей или на правила выдало бы ошибку 404.
Движок стоит DLE

4

Re: Ошибка 404

Вы приведите пример ссылки, я хоть посмотрю подпадает она под правила mod_rewrite, или нет.

5

Re: Ошибка 404

www.romzik.de вот сайт
спускаемся в самый низ страницы, нажимаем Statistics - Ошибка 404, при этом мы видим в адресной строке http://romzik.de/statistics.html
спускаемся опять в самый низ, нажимаем Register, ссылка работает, но в адресной строке какая то фигня http://romzik.de/index.php?do=register
вот этого (index.php?do=) в первом случае не было и выскакивала ошибка 404.

6

Re: Ошибка 404

Выглядит так, будто .htaccess не работает. Посмотрите логи веб-сервера, чтобы понять какой файл пытается запуститься вместо index.php.

Попробуйте после строки:

RewriteEngine On

Добавьте:

RewriteBase /

7 (изменено: Скунса, 2012-04-03 00:53:21)

Re: Ошибка 404

Где и как смотреть логи сервера? Ротацию не ставилi. Сервер Linux

8

Re: Ошибка 404

Hanut,  Вы гений!) В общем сначала добавила RewriteBase /. Вроде ничего не изменилось. Зашла в центр помощи хостинга чтобы разобраться как логи с ошибками выводить, стала делать как там написано, сайт вообще лёг. Нафиг удалила вывод логов, сайт пошёл. Побегала по сайту (добавить новость, профиль пользователя) и на удивление ошибки 404 больше НЕ вылезало. Решила проверить, удалила строчку RewriteBase / из .htaccess - ошибка 404 вернулась, вернула эту строку - всё заработало даже лучше чем было). Спасибо Вам огромное. И можно вопрос, объясните, пожалуйста ПО-РУССКИ в чём заключается функция этой строки, а то гугл вроде пишет по-русски, но непонятно(.

9

Re: Ошибка 404

Скунса сказал:

RewriteBase /

Эта строка отвечает за основание перезапысываемых ссылок. В данном случае, символ косой черты означает корень сайта "/".

Например, при "RewriteBase /" такое правило означает:
RewriteRule ^statistics.html$ index.php?do=stats [L]
http://site.***/statistics.html -> http://site.***/index.php?do=stats

Если перед RewriteRule поставить "RewriteBase /dle/", то это же правило будет означать:
RewriteRule ^statistics.html$ index.php?do=stats [L]
http://site.***/dle/statistics.html -> http://site.***/dle/index.php?do=stats

10

Re: Ошибка 404

Hanut, могли бы помочь?
Нужно настроить 404 ошибку. Файл в корне сайта создан. Думаю, что что-то директивами в .htaccess Неверно.

Сам .htaccess
php_value register_globals Off

ErrorDocument 404 /404.html

AddDefaultCharset utf-8
AddCharset utf-8 *
<IfModule mod_charset.c>
CharsetSourceEnc utf-8
CharsetDefault utf-8
</IfModule>
RewriteEngine On


RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule ^(.*)\.html$ index.php?cat_name=$1 [NC,L,QSA]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*)$ index.php?cat_name=$1 [NC,L,QSA]

RewriteCond %{HTTP_HOST} ^www.......ru$ [NC]
RewriteRule ^(.*)$ http://......ru/$1 [R=301,L]

Сам файл с ошибкой работает, а если забить www.....ru/hgfifdgd, то переход идет на главную страницу.
Если можете, помогите, пожалуйста. Много что перепробовали, но никак не получается, чтоб несуществующие страницы ссылались на 404 ошибку...

11

Re: Ошибка 404

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

В скрипте можно сделать так:

if (параметр не верен) {
    header('HTTP/1.1 404 Not Found');
    print file_get_contents('http://' . $_SERVER['HTTP_HOST'] . '/404.html');
    exit;
}

12

Re: Ошибка 404

Что-то не получается, может что-то не так делаю.
Может быть нужно как-то прописать эту строку:
RewriteRule ^(.*)$ index.php?cat_name=$1 [NC,L,QSA] в файле .htaccess,

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

13

Re: Ошибка 404

Логика у вас такая:

RewriteCond %{REQUEST_FILENAME} !-f // Если запрашиваемый путь не является файлом
RewriteRule ^(.*)\.html$ index.php?cat_name=$1 [NC,L,QSA] // и урл заканчивается на .html, то все, что до .html поместить в параметр cat_name для скрипта index.php

RewriteCond %{REQUEST_FILENAME} !-d // Если запрашиваемый путь не является каталогом
RewriteRule ^(.*)$ index.php?cat_name=$1 [NC,L,QSA] // то весть урл поместить в параметр cat_name для скрипта index.php