Переменные .htaccess mod_rewrite через редирект - PullRequest
4 голосов
/ 28 мая 2011

Короткая версия:

Я написал вопрос и понял, что большинство людей не захотят читать столько текста.Рассмотрим приведенную ниже ссылку, вот 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

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

Кто-нибудь знает, как это сделать?

Ответы [ 2 ]

0 голосов
/ 17 сентября 2011

AFAIK, нет хорошего способа сохранить переменные с помощью перенаправления, не вставляя их в строку запроса ...

0 голосов
/ 28 мая 2011

rfc1738.txt говорит, что # не является допустимым символом URL

дополнительно apache docs говорит, что # сигнализирует комментарий в конфигурационных файлах apache.

короткий ответ: ваше решение не работает, а не ваша реализация

...