リダイレクト/書き換えルールに問題があります。
ここに私のhtaccess ファイルがあります: http://pastebin.com/KJKFGgiH .
環境
すでにオンラインになっている自分の Web サイトで、書き換えられた URL を使用したいと考えています。
私が欲しいのは
誰かが/main.php
(古い URL) を要求したとき、私は彼を/en/
(新しい URL) にリダイレクトし、Apache はmain.php?lang=en
(7 行目の書き換えルールにより) の結果を彼に送信します。また、ユーザーに URL を見せたくないので/main.php
、リダイレクトの代わりに書き換えルールを使用しませんでした。(後で見る)
実際に起こることは
/main.php
ページを尋ねると- Apache はブラウザを次の場所にリダイレクトします
/en/
- 私の
/en/
要求を受け取ると、URl を書き換えます/main.php?lang=en
(これは予想される動作です)。 - その後、apache はそこで停止してリクエストを処理できますが、いいえ、URL をと
/main.php?lang=en
に分割し、新しい URL を書き換えてリダイレクトしようとします (つまり)/main.php
args=lang=en
/main.php
- " " 行が見つかっ
redirect /main.php /en/
たら、それを適用し/main.php
、/en/
- 次に、再度 URL を収集して、
/en/?lang=en
- ブラウザが間違った URL にリダイレクトされる
これは、私が今与えた説明に従うことができるエラーログです(ダウンロードして、メモ帳++または自動改行なしのソフトウェアで開くことをお勧めします):http://pastebin.com/Z9q2pry6 .
解決策は何でしょう
Apache は、リダイレクト ディレクティブを 1 回だけ適用する必要があります。
私が試した解決策1:「if」を使用する
htaccess を次のように変更できることがわかりました。
RewriteRule ^([a-z]{2})/$ /main.php?lang=$1 [L,E=no_more_redirect:1]
<If "env('no_more_redirect') != 1">
Redirect 301 /main.php /en/
</If>
->どのように機能し、私の問題を解決するのか:
- Apache が
/main.php
リクエストを受け取ると、リダイレクトが適用されます - リクエストを受け取る
/en/
と、URL を に書き換え、1/main.php?=lang=en
に設定しますno_more_redirect
- すべてのルールとリダイレクト ディレクティブを適用しようとすると、"
Redirect 301 /main.php /en/
" が適用されなくなります。 - リクエストを処理し
/main.php?lang=en
ます。 - わーい!しかし、うまくいきません。バツ(
これは、このソリューションで到達しようとしたときに取得するエラー ログです/main.php
: ああ、評判が 10 未満であるため、2 つ以上のリンクを投稿することはできませんが、基本的には次のようになります。
- それは私の
/main.php
要求を受け取ります - それは私をにリダイレクトします
/en/
- ANDに書き換え
/en/
て1にする/main.php?lang=en
no_more_redirect
- しかし、条件をチェックすると、0 を与えるべきときに 1 を与え、リダイレクトが 2 回目に適用されます。失敗。
問題は、タグの構文がよくわからないこと<if>
と、ドキュメント (ここを参照してください: 2 つ以上のリンクを投稿することはできません:c) があまり明確ではありません。また、私は環境変数とサーバー変数の違いを本当に知りません。インターネットで見たことが<if %{name_of_variable}
あり<if env('name_of_variable')
ます。
また、試行ごとにブラウザーのキャッシュをクリアすることを知っておく必要があります。そうしないと、奇妙な動作をします。
私が試した解決策2:REQUEST_URL
指定されたURLを含むものを使用しようとしまし%{REQUEST_URI}
た(ここを参照してください:ここでも2つ以上のリンクを投稿できません...)のように
<if "%{REQUEST_URI} != '/en/'">
Redirect 301 /main.php /en/
</If>
しかし、何が起こるかというと、Apache が/en/
リクエストを取得して<if>
条件をチェックすると、0 が返されますが (これは予想される動作です)、Apache が書き換え/en/
て/main.php?lang=en
、書き換えルールとリダイレクト ディレクティブを適用しようとすると、%{REQUEST_URI}
変更され、Apache が条件をチェックすると、<if>
条件、それは 1 を与え、/main.php
に置き換えられ/en/
、 を与え/en/?lang=en
ます。再び失敗します。
number3 を試した解決策: IS_SUBREQ
解決策を探している間、私はここを読みました:(2つ以上のリンクを投稿することはできません:c)、処理されているリクエストがサブリクエスト(モジュールが正常に機能するために作成されたリクエスト)である場合、変数IS_SUBREQ
はそうです。true
apache がとに分割/main.php?lang=en
されたとき、ルールとディレクティブを適用しようとすると、それはサブリクエストに違いないと思いました。だから私は試しました:/main.php
args=lang=en
<If "%{IS_SUBREQ} != 'true'">
Redirect 301 /main.php /en/
</If>
しかし、実際には、URL 分割後もIS_SUBREQ
false になることはなく、式の評価 (if 条件をチェックするとき) は常に 1 になります。したがって、この解決策は失敗です。
そのため、ここに質問を投稿しています。このような長い投稿を読んでいただきありがとうございます。