1

リダイレクト/書き換えルールに問題があります。
ここに私のhtaccess ファイルがあります: http://pastebin.com/KJKFGgiH .

環境

すでにオンラインになっている自分の Web サイトで、書き換えられた URL を使用したいと考えています。

私が欲しいのは

誰かが/main.php(古い URL) を要求したとき、私は彼を/en/(新しい URL) にリダイレクトし、Apache はmain.php?lang=en(7 行目の書き換えルールにより) の結果を彼に送信します。また、ユーザーに URL を見せたくないので/main.php、リダイレクトの代わりに書き換えルールを使用しませんでした。(後で見る)

実際に起こることは

  1. /main.phpページを尋ねると
  2. Apache はブラウザを次の場所にリダイレクトします/en/
  3. 私の/en/要求を受け取ると、URl を書き換えます/main.php?lang=en(これは予想される動作です)。
  4. その後、apache はそこで停止してリクエストを処理できますが、いいえ、URL をと/main.php?lang=enに分割し、新しい URL を書き換えてリダイレクトしようとします (つまり)/main.phpargs=lang=en/main.php
  5. " " 行が見つかっredirect /main.php /en/たら、それを適用し/main.php/en/
  6. 次に、再度 URL を収集して、/en/?lang=en
  7. ブラウザが間違った 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>

->どのように機能し、私の問題を解決するのか:

  1. Apache が/main.phpリクエストを受け取ると、リダイレクトが適用されます
  2. リクエストを受け取る/en/と、URL を に書き換え、1/main.php?=lang=enに設定しますno_more_redirect
  3. すべてのルールとリダイレクト ディレクティブを適用しようとすると、" Redirect 301 /main.php /en/" が適用されなくなります。
  4. リクエストを処理し/main.php?lang=enます。
  5. わーい!しかし、うまくいきません。バツ(

これは、このソリューションで到達しようとしたときに取得するエラー ログです/main.php: ああ、評判が 10 未満であるため、2 つ以上のリンクを投稿することはできませんが、基本的には次のようになります。

  1. それは私の/main.php要求を受け取ります
  2. それは私をにリダイレクトします/en/
  3. ANDに書き換え/en/て1にする/main.php?lang=enno_more_redirect
  4. しかし、条件をチェックすると、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はそうです。trueapache がとに分割/main.php?lang=enされたとき、ルールとディレクティブを適用しようとすると、それはサブリクエストに違いないと思いました。だから私は試しました:/main.phpargs=lang=en

<If "%{IS_SUBREQ} != 'true'">
Redirect 301 /main.php  /en/
</If>

しかし、実際には、URL 分割後もIS_SUBREQfalse になることはなく、式の評価 (if 条件をチェックするとき) は常に 1 になります。したがって、この解決策は失敗です。

そのため、ここに質問を投稿しています。このような長い投稿を読んでいただきありがとうございます。

4

1 に答える 1

1

実際、私の問題は別の問題を隠していました。本当の問題はここでのループの問題ですが、args のおかげで、ループは最初の (しかし 1 つ多すぎる) 発話で停止します。「rewrite rule redirect loop」を検索する必要がありましたが、ここですぐに答えを見つけました: .htaccess redirect loop when Redirect and RewriteRule together . この解決策を私の問題に適用するには、rewrite_mod を使用して 301 リダイレクトを行い、a を設定する必要がありRewriteCond %{ENV:REDIRECT_STATUS} !200ました。問題は、これがどのように機能するかまだわからないということです。それはそうですが、理由はわかりません。/en/ URL が書き換えられると REDIRECT_STATUS が 200 になるのはなぜですか? しかし、ここはこの質問をする場所ではないと思います。

于 2013-08-18T22:57:05.303 に答える