Прогеры, помогите.

12
den78ru
На сайте с 12.04.2006
Offline
395
1264

Ввиду того, что много юзеров ставят ссылки на мой сайт кривыми, а они иногда с нужными анкорами и на целевые страницы, сделал следующее:

Содержимое файла 404:

<?
$err = array(

"/ххх/ххх_" => "/ххх/ххх_ххх.html",
"/site.html." => "/site.html",
"/ххх/1" => "/ххх/1.html",
"/&&&&nbsp" => "/",
"/!vip" => "/"
);
$str = @$_SERVER["QUERY_STRING"].@$_SERVER["REQUEST_URI"];
foreach($err as $key => $now)
if(substr($str, ((-1)*strlen($key))-1)==$key)
{
@header("Status: 301 Moved Permanently");
@header("Location: http://".(@$_SERVER["HTTP_HOST"]!="localhost"?(@substr(@$_SERVER["HTTP_HOST"],0,4)!="www."?"www.":"").@$_SERVER["HTTP_HOST"]:"localhost").$now);
@exit();
}
?>

<p><font color="red"><?=@$_SERVER["QUERY_STRING"].@$_SERVER["REQUEST_URI"]?></font> - Страница в разработке. Ошибочка вышла.<P>Поишите с <a href='<? print "http://"; if(@substr(@$_SERVER["HTTP_HOST"],0,4)!="www.") print "www."; print @$_SERVER["HTTP_HOST"]; ?>'>Главной</a>.<br/> или воспользуйтесь меню навигации.
</p>

Т.е. при запросе несуществующей страницы сначала чекается список (в реале он больше) перенаправлений, и если этого урла нет в списке - выдаётся страница 404, если есть срабатывает 301.

Всё хорошо, всё работает, но Я. воспринял не 301, а 302, и, соответственно, в выдаче вместо нормальных урлов появились кривые.

Платон мотивировал это тем, что при 302 алгоритм выбирает тот урл, который короче. Типа, перебейте на 301 и нормальные урлы вернутся в выдачу автоматом.

На позициях в выдаче это никак не отразилось.

Хелп, почему Я. видит 302, гоша и рама всё верно обработали.

Люди не делятся на национальности, партии, фракции и религии. Люди делятся на умных и дураков, а вот дураки делятся на национальности, партии, фракции и религии.
M
На сайте с 17.04.2008
Offline
88
MBo
#1

только что проверил, не передаётся 301 в хедер,

нужно заменить строку

@header("Status: 301 Moved Permanently");

на следующую:

header("HTTP/1.1 301 Moved Permanently");

или

header("HTTP/1.1 301");

den78ru
На сайте с 12.04.2006
Offline
395
#2
MBo:
только что проверил, не передаётся 301 в хедер,
нужно заменить строку
@header("Status: 301 Moved Permanently");
на следующую:
header("HTTP/1.1 301 Moved Permanently");
или
header("HTTP/1.1 301");

Простите за назойливость, а с ("HTTP/1.1 301 Moved Permanently"); 301 передаёт? Т.е. экспериментально проверено?

M
На сайте с 17.04.2008
Offline
88
MBo
#3

проверено, да и сами можете проверить заголовки на корректность

или в firefox с плагином, типа,

livehttpheaders

https://addons.mozilla.org/en-US/firefox/addon/3829/

или на сервисах, типа

http://www.rexswain.com/httpview.html

кривой урл чекните и увидите, что вместо 301 идёт 302.

den78ru
На сайте с 12.04.2006
Offline
395
#4

100500 спасибо. :)

[Удален]
#5

забаньте его уже.

По теме: нет такого HTTP заголовка как Status.

Ссылки по теме:

http://en.wikipedia.org/wiki/List_of_HTTP_headers

http://en.wikipedia.org/wiki/HTTP_301

den78ru
На сайте с 12.04.2006
Offline
395
#6

Ребята, ещё один вопрос о ЧПУ:

Урлы на сайте имею вид

/index.php?page=1&offset=53

Вместо 1 в параметре page= может быть и цифра и слово латиницей. В offset= только цифры.

Хотелось бы сделать их вида:

/1/53.html

Запись в хтакцесс вида:

RewriteEngine on

Options +FollowSymlinks

RewriteBase /

RewriteRule ^(.*)/([0-9]+)\.html$ /index.php?page=$1&offset=$2 [QSA]

почему-то не работает.

Хелп. :)

M
На сайте с 17.04.2008
Offline
88
MBo
#7

RewriteEngine on

RewriteRule ^.htaccess$ - [F]

RewriteRule ^([A-Za-z0-9-]+)/([0-9]+)\.html?$ z.php?page=$1&offset=$2 [L]

MBo добавил 21.07.2010 в 12:25

вместо z.php index.php :)

den78ru
На сайте с 12.04.2006
Offline
395
#8

RewriteEngine on

RewriteRule ^.htaccess$ - [F]

RewriteRule ^([A-Za-z0-9-]+)/([0-9]+)\.html?$ index.php?page=$1&offset=$2 [L]

Не работает, правда на локале пробую, посмотрим что сервер скажет. Сайт залил, через несколько часов ДНС обновится и будем посмотреть, может дело в конфиге апача. Хотя, вчера сисадмин конфиг смотрел, всё норм, да и остальные приблуды в работают на локале без проблем, за 4 года первый раз такое.

den78ru добавил 21.07.2010 в 12:57

Вот полный файл:

AddType application/x-httpd-php php phtml html htm

Options -Indexes

ErrorDocument 404 /index.php

IndexIgnore .htaccess */.??* *~ *# */HEADER* */README* */_vti*

RewriteEngine on

RewriteCond %{HTTP_HOST} ^****\.ru(.*)$ [NC]

RewriteCond %{HTTP_HOST} !^www\.(.*)$ [NC]

RewriteRule (.*) http://www.%{HTTP_HOST}/$1 [R=permanent,L]

RewriteEngine on

RewriteRule ^.htaccess$ - [F]

RewriteRule ^([A-Za-z0-9-]+)/([0-9]+)\.html?$ index.php?page=$1&offset=$2 [L]

M
На сайте с 17.04.2008
Offline
88
MBo
#9

из последнего блока можно убрать дублирование

RewriteEngine on

RewriteRule ^.htaccess$ - [F]

проверил ещё раз, включая полный htaccess – работает на локалке и сервере,

может не включён mod_rewrite ?

протестируйте, в htaccess закомментируйте всё или удалите на время, внесите


RewriteEngine on
RewriteRule ^.htaccess$ - [F]
RewriteRule ^(.*)(\/|\.html)$ index.php?page=$1 [QSA,L]

в index.php в самое начало файла после <?php или <? внесите


if($_SERVER['REQUEST_URI']!='/') {
if(isset($_GET['page'])) {
echo 'page: '.$_GET['page'].'.html<br>';
echo 'mod_rewrite OK<br>';
} else {
echo 'no mod_rewrite';
}
} else {
echo 'index<br><a href="/'.mt_rand(10,100).'.html">random url</a>';
}
exit();

посмотрите, что выйдет.

den78ru
На сайте с 12.04.2006
Offline
395
#10

:)

no mod_rewrite - это со старым хтакцесс

с новым:

page: 30.html

mod_rewrite OK

Фишка в том, что при исходных файлах, страницы открываются и по старым и по новым адресам(если вбивать их руками в адресную строку), только дошло руками проверить. А вот автоматом не переколбашивает почему-то.

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий