Перенаправление 301 с хэш-частью (якорем) #
Один из наших веб-сайтов имеет URL-адрес: example.oursite.com
. Мы решили переместить наш сайт с таким URL-адресом www.oursite.com/example
. Чтобы сделать это, мы написали правило перезаписи на нашем сервере Apache, которое перенаправляет наш новый URL с кодом 301.
Многие веб-сайты ссылаются на нас с URL-адресами формы example.oursite.com/#id=23
. Проблема в том, что перенаправление стирает хэш-часть URL-адреса с IE. Насколько мне известно, хэш-часть никогда не отправляется на сервер.
Я хотел реализовать перенаправление с javascript, чтобы сохранить хеш-часть, но поисковая система не будет знать, что наш URL-адрес изменился. (код 301 не возвращается)
Я хочу, чтобы поисковая машина была уведомлена о нашем новом URL (301), потому что нам нужно перенести ранг страницы на наш новый URL.
Есть ли способ перенаправить код 301 и сохранить хэш-часть (#id=23
) в URL?
Ответы
Ответ 1
Поисковые системы действительно заботятся о хэш-тегах, они часто используют их для выделения определенного контента на странице.
Однако, к вопросу, к сожалению, места привязки, к сожалению, не отправляются на сервер как часть HTTP-запроса. Если вы хотите перенаправить пользователя, вам нужно будет сделать это в Javascript на стороне клиента.
Хорошая статья: http://web.archive.org/web/20090508005814/http://www.mikeduncan.com/named-anchors-are-not-sent/
Ответ 2
Я абсолютно уверен, что часть привязки/закладки/страницы привязки/страницы URL не индексируется поисковыми системами и поэтому не влияет на рейтинг вашей страницы. Выполнение google-поиска для "inurl: #" возвращает нулевые документы, так что резервное копирование моего предположения. Ссылки с внешних сайтов будут индексироваться без хеша.
Вы правы в том, что хэш-часть не отправляется на сервер, насколько я знаю, нет хорошего способа создать URL-адрес перенаправления с хешем в нем.
Из-за этого браузер должен правильно управлять хэшем во время перенаправления. Firefox 3.5, похоже, делает это успешно. Если вы добавите хэш к URL-адресу, который имеет известную переадресацию, вы увидите изменение URL-адреса в адресной строке в новом местоположении, но хеш останется там успешно.
Изменить. В ответ на комментарий ниже, если не является символом хэша во внешнем URL-адресе нужной вам части, то вполне возможно переписать URL. Правило перезаписи Apache позаботится об этом:
RewriteCond %{HTTP_HOST} !^exemple\.oursite\.com [NC]
RewriteCond %{HTTP_HOST} !^$
RewriteRule ^/(.*) http://www.oursite.com/exemple/$1 [L,R]
Если вы не используете Apache, вам придется заглянуть в документы сервера для чего-то подобного.
Ответ 3
В Google есть специальный синтаксис для приложений AJAX, основанный на хэш-адресах: http://code.google.com/web/ajaxcrawling/docs/getting-started.html
Ответ 4
Вы можете создать страницу на старом адресе, который ловит все запросы и перенаправляет на новый сайт с правильным адресом и кодом.
Я сделал что-то подобное, но это было в asp.net, и я думаю, что это не тот язык, который вы используете. Во всяком случае, должен быть способ сделать это на любом языке.
Ответ 5
При возврате статуса 301 ваш сервер должен вернуть заголовок "Местоположение", который указывает на новое местоположение. На практике способ, которым это выполняется, варьируется; некоторые серверы предоставляют полный URL (netloc и путь), некоторые просто предоставляют новый путь и ожидают, что браузер будет искать этот путь в исходном netloc. Похоже, ваше правило перезаписи лишает путь.
Легкий способ увидеть, что возвращает заголовок Location, в оболочке python:
>>> import httplib
>>> conn = httplib.HTTPConnection('exemple.oursite.com')
>>> conn.request('HEAD', '/')
>>> res = conn.getresponse()
>>> print res.getheader('location')
Я боюсь, что не знаю достаточно о mod_rewrite, чтобы правильно рассказать о правиле перезаписи, но это должно дать вам представление о том, что ваш сервер действительно говорит клиентам.
Ответ 6
Видя, как сервер никогда не увидит #
(исключая 301 переадресацию), и Google устарел от схемы AJAX Crawling, похоже что выходное решение - единственный способ!
Как я это сделал:
(function() {
var redirects = [
['#!/about', '/about'],
['#!/contact', '/contact'],
['#!/page-x', '/pageX']
]
for (var i=0; i<redirects.length; i++) {
if (window.location.hash == redirects[i][0]) {
window.location.replace(redirects[i][1]);
}
}
})();
Я предполагаю, что, поскольку искатели Google действительно выполняют Javascript, новые страницы будут правильно проиндексированы.
Я поместил его в тег <script>
непосредственно под тегом <title>
, чтобы он выполнялся перед любым другим JS/CSS. Обратите внимание, что этот script должен быть необходим только для вашего индексного файла.
Ответ 7
Я зарегистрировал свою учетную запись, поэтому я не могу ее редактировать.
zombat: Извините, я допустил ошибку в своем комментарии. Ссылка на наше видео - example.oursite.com/#video_id=233. В этом случае мое правило перезаписи в Apache не работает.
Ник Берарди: Мы изменили способ работы наших ссылок. Мы больше не используем #, только для обратной совместимости
Ответ 8
Поисковые боты не заботятся о хэш-тегах. И если вы используете их для каких-либо флеш-вызовов или вызовов AJAX, у вас возникают более серьезные проблемы, чем переадресация 301 не работает. Поскольку, если у вас нет контента в альтернативной форме, поисковые системы не индексируют ваш сайт, и вы определенно страдаете, насколько продвигается SEO.