Короткая версия:
Я написал вопрос и понял, что большинство людей не захотят читать столько текста.Рассмотрим приведенную ниже ссылку, вот TL; DR:
Мне нужно 301 перенаправить этот URL http://app.com/search/foo-bar/
на этот URL http://app.com/#!/search/foo-bar/
и отправить это: /foo-bar/
, или что-нибудь еще после /search/
скрипту на стороне сервера.В этом случае он написан на php.
Редактировать для ясности:
Текущие ответы, кажется, сосредоточены на переписывании в hashbang.Эта часть не проблема.Проблема в том, что я теряю все связанные данные при перезаписи на URL-адрес хэш-банга, так как на стороне сервера в качестве местоположения будет отображаться app.php, а не app.php / #! / Foo-bar / - поэтому мне нужно захватить foo-barи отправьте его на сервер где-нибудь, кроме как в URL.Перезапись работает, и это не проблема.Спасибо за ваши ответы, хотя!
Длинная версия:
Хорошо, поэтому у меня есть интересная проблема, с которой мне было трудно разобраться.
Сценарий:
У меня есть приложение backbone.js, которое использует hashbang для состояния:
app.com/#!/search/search-term/key-value/foo-bar/
Кроме того, у меня идет трафик Googleна сайт из предыдущей версии, который будет использовать URL-адреса в стиле «довольно URL»:
app.com/search/search-term/key-value/foo-bar/
Я использую .htaccess mod_rewrite, чтобы поменять старый URL на хешбэнг, еслипользователь переходит на устаревший URL.
Недавно я представил загрузочную версию сайта без javascript, на которой будет построен сайт, чтобы изящно понижать версию и поддерживать сканеры.Это написано с использованием php.
Чтобы сайт php работал, мне нужно передать значения после hashbang скрипту на стороне сервера, чтобы я мог выяснить, что отображать.
Проблема:
Когда я преобразую URL-адрес и добавляю привязку, все, что за привязкой (hashbang), больше не отправляется на запрос, поэтому у меня нет доступа к нему вphp.
RewriteRule search/?(.*) #!/search/$1 [R=301,NC,L]
Мои параметры для отправки вещей на серверную сторону затем уменьшены до: 1. Строка запроса 2. Переменные среды 3. Заголовки
Итак,Я попытался отправить вещи через строку запроса
RewriteRule search/?(.*) #!/search/$1?filter=$1 [R=301,NC,L]
Очевидно, что это не сработало (запрос находится за якорем), поэтому я попробовал его перед хэшбэнгом
RewriteRule search/?(.*) ?filter=$1/#!/search/$1 [R=301,NC,L]
Это работает, но отвратительно и избыточно для конечного пользователя.Итак, я подумал, что мог бы попытаться использовать переменные окружения.
RewriteRule search/?(.*) /!#/search/$1 [R=301,NC,L,E=FILTER:$1]
Это не удалось, потому что переменные окружения не сохраняются при перенаправлении (duh).Я обратился к использованию заголовков:
RewriteRule search/?(.*) /#!/search/$1 [R=301,NC,L,E=FILTER:$1]
Header set filterParams "%{FILTER}e"
Но по какой-то причине заголовки не принимаются страницей через перенаправление.Это, казалось, имело смысл (хотя я теперь вышел далеко за пределы своего уровня комфорта с помощью директив apache), поэтому я попытался повторить заголовок, в надежде, что он будет пропущен, получен вторым переписыванием (которое не нашло поиск), и повторил.
RewriteRule search/?(.*) /#!/search/$1 [R=301,NC,L,E=FILTER:$1]
Header set filterParams "%{FILTER}e"
Header echo filterParams
Нада - фильтр не существует, поэтому хотяэто делает это к серверу, это является нулевым.Моей следующей мыслью было попытаться использовать какое-то условное условие.Вот моя попытка:
RewriteRule search/?(.*) legacy.php/#!/search/$1 [R=301,NC,L,E=FILTER$1]`
<FilesMatch "legacy.php">
Header set filterParams "%{FILTER}e"
</FilesMatch>
Header echo filterParams
Это тоже не сработало, так что я в тупике.Я понимаю, что потратил так много времени на это, что у меня, вероятно, есть решение в моих руках, и я просто устал смотреть на него, или это даже отдаленно невозможно, даже с грубым взломом заголовка.
Кто-нибудь знает, как это сделать?