Редирект 301 с хэш-частью (якорь) # - PullRequest
21 голосов
/ 04 августа 2009

Один из наших веб-сайтов имеет такой 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?

Ответы [ 8 ]

14 голосов
/ 04 октября 2010

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

К этому вопросу, однако, якорные местоположения, к сожалению, не отправляются на сервер как часть HTTP-запроса. Если вы хотите перенаправить пользователя, вам нужно будет сделать это в Javascript на стороне клиента.

Хорошая статья: http://web.archive.org/web/20090508005814/http://www.mikeduncan.com/named-anchors-are-not-sent/

2 голосов
/ 20 октября 2010

У Google есть специальный синтаксис для приложений AJAX, основанный на хэш-URL: http://code.google.com/web/ajaxcrawling/docs/getting-started.html

2 голосов
/ 04 августа 2009

Я вполне уверен, что часть 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, вам придется поискать что-то похожее в документации к серверу.

1 голос
/ 02 марта 2016

Поскольку сервер никогда не увидит # (исключая 301 переадресацию), и Google устарела их Схема сканирования AJAX , похоже, что единственное решение - это интерфейсное решение!

Как я это сделал:

 (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. Обратите внимание, что этот сценарий требуется только для вашего индексного файла.

1 голос
/ 04 августа 2009

При возврате статуса 301 ваш сервер должен возвращать заголовок «Location:», который указывает на новое местоположение. На практике способ реализации этого варьируется; некоторые серверы предоставляют полный 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, чтобы сказать вам, как правильно выполнить правило перезаписи, но это должно дать вам представление о том, что ваш сервер на самом деле говорит клиентам.

1 голос
/ 04 августа 2009

Вы можете создать страницу по старому адресу, которая перехватывает все запросы и перенаправляет на новый сайт с правильным адресом и кодом.

Я сделал что-то подобное, но это было на asp.net, который, я думаю, это не тот язык, который вы используете. В любом случае должен быть способ сделать это на любом языке.

0 голосов
/ 05 августа 2009

Поисковые роботы не заботятся о хеш-тегах. И если вы используете их для вызовов типа flash или AJAX, у вас есть более серьезные проблемы, чем то, что ваши перенаправления 301 не работают. Потому что, если у вас нет контента в альтернативной форме, поисковые системы не индексируют ваш сайт, и вы определенно страдаете, насколько SEO идет.

0 голосов
/ 04 августа 2009

Я зарегистрировал свой аккаунт, поэтому не могу редактировать.

zombat: извините, я допустил ошибку в своем комментарии. Ссылка на наше видео - instancele.oursite.com/#video_id=233. В этом случае мое правило перезаписи в Apache не работает.

Ник Берарди: Мы изменили способ работы наших ссылок. Мы больше не используем #, только для обратной совместимости

...