только что проверил, не передаётся 301 в хедер,
нужно заменить строку
@header("Status: 301 Moved Permanently");
на следующую:
header("HTTP/1.1 301 Moved Permanently");
или
header("HTTP/1.1 301");
Options +FollowSymLinks RewriteEngine on RewriteRule ^.htaccess$ - [F] RewriteRule ^([a-z]+)(-[0-9]{1,3}-)([0-9]{1,7})\.html$ /$1$3.html [R=301,L]
конечно склеит, нет различия в способах инициации редиректа (.htaccess или скрипт),
бот или браузер в обоих случаях получат ответ сервера с заголовками, типа,
HTTP/1.x 301 Moved Permanently
Date: Wed, 12 Aug 2009 14:15:04 GMT
Server: Apache/2.2.4 (Win32) mod_ssl/2.2.4 OpenSSL/0.9.8d PHP/5.2.4
Location: http://host.com/
Content-Length: 0
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=windows-1251
зацикливание происходит, с index.php на index.php, лучше сделать редирект вот так:
нужно прописать в index.php в самом начале файла, можно сразу после <?php
if($_SERVER['REQUEST_URI']=='/index.php'){header('HTTP/1.x 301 Moved Permanently');header('Location: http://test.com/');exit();}
/ru/forum/comment/4877769
1) в этом варианте сервер выдаст в хедер код 410 на любые GET запросы
RewriteEngine on RewriteRule ^.htaccess$ - [F] RewriteCond %{QUERY_STRING} .+ RewriteRule ^(.*) /? [G,L] ErrorDocument 410 /404.html
2) в этом варианте сервер выдаст в хедер код 410 только на GET запросы /?cat= и /?p=
RewriteEngine on RewriteRule ^.htaccess$ - [F] RewriteCond %{QUERY_STRING} (cat|p)=(.*)$ RewriteRule ^(.*) /? [G,L] ErrorDocument 410 /404.html
3) в этом варианте любые GET запросы средиректятся на главную, сервер выдаст в хедер код 301
RewriteEngine on RewriteRule ^.htaccess$ - [F] RewriteCond %{QUERY_STRING} .+ RewriteRule ^(.*) /? [R=301,L]
4) в этом варианте средиректятся только GET запросы /?cat= и /?p=, сервер выдаст в хедер код 301
RewriteEngine on RewriteRule ^.htaccess$ - [F] RewriteCond %{QUERY_STRING} (cat|p)=(.*)$ RewriteRule ^(.*) /? [R=301,L]
значение кода 410 – урл навсегда удалён с сервера,
значение кода 301 – старый урл навсегда перемещён на новый урл,
в 1 и 2 вариантах редиректов происходить не будет, например, на запрос http://host.com/?cat=12 сервер выдаст в хедер код ошибки 410 и покажет содержимое страницы, прописанной в ErrorDocument 410 /404.html , но в строке браузера урл будет такого вида http://host.com/?cat=12
в 3 и 4 вариантах произойдёт редирект на морду, т.е. при запросе http://host.com/?cat=12 откроется http://host.com/
в этой задаче самое главное передать поисковикам необходимые коды, а редиректить на 404.html не надо, потому что на 404.html сервер отдаст код 200, получится, что все старые страницы переехали на новый урл 404.html
возможное решение, в IE 6 и FF 3 страница редиректится из фрейма на свой урл, в Опере не работает
<script language="javascript" type="text/javascript"> function gH() { top.location="http://host.com/"; } window.onerror = gH; if (top.location.href != window.location.href) {top.location = "http://host.com/";} </script>
проверено при таком коде:
<script language="javascript" type="text/javascript">
top.frames=null;self = null;parent = null;top = null;self.ifra.parent = null;
</script>
<iframe src="http://host.com/" width="900" height="600"></iframe>
ещё вариант, в хедере 301
RewriteEngine on RewriteRule ^.htaccess$ - [F] RewriteCond %{QUERY_STRING} (cat|p)=(.*)$ RewriteRule ^/?$ /? [R=301,L]
спасибо за иное решение, работает, 301-й добавил и путь от корня:
RewriteRule page1\.php /page2.php?%{QUERY_STRING} [R=301,L]
да не работает, даже со слешем, :)
или у кого-то работает на практике эта строка?
RewriteRule page1.php\?v=(.*) page2.php?v=$1 [L]