短縮版:
私は質問を書きましたが、ほとんどの人はそれほど多くのテキストを読みたくないことに気付きました。以下の参照を検討してください。TL;DR は次のとおりです。
この URL を 301 リダイレクトする必要がありますhttp://app.com/search/foo-bar/
このURLにhttp://app.com/#!/search/foo-bar/
これを送信します: /foo-bar/
、または過去/search/
のものをサーバー側スクリプトに送信します。この例では、php で記述されています。
わかりやすくするために編集します。
現在の回答は、ハッシュバンへの書き換えに焦点を当てているようです。その部分は問題ではありません。問題は、サーバー側が app.php/#!/foo-bar/ ではなく app.php を場所と見なすため、ハッシュバン URL に書き換えると関連データが失われることです。したがって、foo-bar をキャプチャする必要があります。 、URL 以外の場所でサーバーに送信します。書き換えは機能し、問題ではありません。あなたの答えをありがとう!
長いバージョン:
わかりました、私には理解するのが難しい興味深い問題があります。
シナリオ:
状態に hashbang を使用する backbone.js アプリがあります。
app.com/#!/search/search-term/key-value/foo-bar/
さらに、「pretty url」スタイルの URL をヒットする以前のバージョンからサイトに来る Google トラフィックがあります。
app.com/search/search-term/key-value/foo-bar/
ユーザーがレガシー URL にアクセスした場合、.htaccess mod_rewrite を使用して、古い URL をハッシュバン グされた URL に交換します。
私は最近、適切にダウングレードしてクローラーをサポートするために、サイトがその上に構築される JavaScript を使用しないブートストラップ バージョンのサイトを導入しました。これはphpを使用して書かれています。
PHP サイトを機能させるには、hashbang の後の値をサーバー サイド スクリプトに渡す必要があります。これにより、何を表示するかを判断できます。
問題:
URL を変換してアンカーを追加すると、アンカー (ハッシュバン) を超えるものはすべてリクエストに送信されなくなるため、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
灘 - フィルターが存在しないため、サーバーに到達しますが、null です。次に考えたのは、ある種の条件を採用することでした。これが私の試みでした:
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
それもうまくいかないようだったので、私は困惑しています。私はこれに長い間費やしてきたので、おそらく解決策を把握している可能性があり、それを見るのにうんざりしているか、ひどいヘッダーハッキングを使用しても、リモートでさえ不可能であることに気づきました。
誰でもこれを行う方法の手がかりを持っていますか?