Вопрос или проблема
Я создал сайт, который использует систему загрузки страниц с помощью javascript через /#!/ hashbang. Все мои URL содержат обработчики onclick, которые возвращают false, но сам тег href ведет на реальную ссылку. Вот пример:
<a href="/contact" onclick="loadPage('contact);return false;">Контакт</a>
Эта функция обрабатывает связь с сервером, и всё работает отлично.
Я хочу настроить файл .htaccess (если это возможно), чтобы переадресовывать пользователя без javascript (или паука) на страницу, которая на самом деле не существует. Я хочу, чтобы сервер перенаправлял пользователя на /#!/contact, не отправляя ответ 404.
Вот что я попробовал:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /#!/$1 [L]
Я ожидаю, что некоторые предложат, что это неправильный подход, но помимо этого, возможно ли это вообще?
(некоторые связанные страницы, которые не кажутся совсем релевантными:)
.htaccess 301 Перенаправление хеш-тега
https://stackoverflow.com/questions/15133023/hash-url-rewrite-in-htaccess
.htaccess 301 Перенаправление хеш-тега
Ответ или решение
К сожалению, ваша задача внедрения редиректа с использованием хеш-диапазона (hash-bang), то есть /#!/contact
, через файл .htaccess
вызывает определенные трудности, так как сервер не обрабатывает часть URL-адреса после знака #
. Хеш-таблицы обрабатываются на стороне клиента браузером, и сервер не имеет доступа к этой информации.
Тем не менее, вы можете использовать следующие шаги для достижения желаемого результата, обеспечив пользователей без JavaScript, работающих с подобным контентом, перенаправлением на другую страницу.
-
Создайте обертку для вашего контента: Вместо того чтобы пытаться редиректить на
/#!/contact
, создайте страницу/contact
, которая будет служить для пользователей без JavaScript. На этой странице можно предоставить необходимую информацию, или же добавить сообщение, что требуется включить JavaScript для полнофункционального использования. -
Настройка .htaccess: Вы можете настроить
.htaccess
, чтобы обрабатывать запросы к несуществующим страницам, перенаправляя их на соответствующий путь. Вот пример того, как это можно сделать:
RewriteEngine On
RewriteBase /
# Если запрашивается существующий файл или директория, ничего не делаем
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Тогда перенаправляем на страницу, которая объясняет, что требуются JavaScript для работы
RewriteRule ^(.*)$ /no-js.html [L]
В этом примере, если пользователь пытается получить доступ к /contact
, он будет перенаправлен на /no-js.html
, где вы можете информировать пользователя о необходимости включения JavaScript и дать ему альтернативные ссылки.
- Реализация клиентского редиректа: Если вам нужно, чтобы пользователи с поддержкой JavaScript автоматически перенаправлялись к нужному хешу после загрузки страницы, вы можете добавить скрипт на свою
no-js.html
, который будет делать редирект на нужный хеш, если JavaScript включен.
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<title>JavaScript требуется</title>
<script>
window.onload = function() {
window.location.href = "/#!/contact";
}
</script>
</head>
<body>
<h1>Требуется JavaScript</h1>
<p>Для просмотра содержимого этой страницы требуется включить JavaScript. Пожалуйста, включите его и перейдите по <a href="/#!/contact">ссылке</a>.</p>
</body>
</html>
Таким образом, вы обеспечите необходимую функциональность и позаботитесь о пользователях, не поддерживающих JavaScript.
Надеюсь, эти рекомендации помогут вам реализовать нужное поведение на вашем сайте.