2017-10-05 3 views
1

私は私の.htaccessに以下を追加したいくつかのPHPソフトウェアをインストール:これは何を最初の引数が単なるドットの場合、RewriteRuleはどのように機能しますか?

RewriteCond %{REQUEST_URI} ^(.*)//(.*)$ 
RewriteRule . %1/%2 [R=301,L] 

しているのですか?それは、その後http:/foo.bar.comで、任意の文字、.を交換http:foo.bar.com、などhttp://foo.bar.comをキャプチャだ:明らかに間違っている

私の解釈は、。間違いなく、そうですか?

+0

%{REQUEST_URI}はドメインと一致せず、foo.bar.comに一致するのは%{HTTP_HOST}です。必要な情報を教えてください。 –

+0

ああ、大丈夫です。それから私は間違っていた。しかし、関係なく、私はそれが何を理解しようとしています。なぜ二重のスラッシュがあるのでしょうか? –

+0

このコードは本当に私にユーザーエクスペリエンスレベルを高めるために適用される新しいテクニックを与えるので、ユーザーが誤ってスラッシュを追加すると、彼は正しく行くべきです、多くの感謝 –

答えて

4

それは、http:foo.bar.comとしてhttp://foo.bar.comを獲得、その後http:/foo.bar.comで、任意の文字、.を交換しています。間違いなく、そうですか?

右は間違いありません。 :)

このコードは、URLパスに一緒に現れる複数のスラッシュを1つのスラッシュに減らします。したがって、example.com/foo//bar////bazのようなURLはexample.com/foo/bar/bazになります。

REQUEST_URIサーバ変数には、URLパスのみが含まれます(スラッシュで始まります)。例えば。 (上記の例)。 %1および%2は、最後にマッチしたCondPattern(つまり、ダブルスラッシュの両側の文字列)のキャプチャされたグループの後方参照です。

RewriteRuleの単一ドット(.)のパターンは、1文字に一致します。したがって、このルールは、URLパスが空の場合はドキュメントルートを除くすべてのURLに一致します。

複数のスラッシュをチェックする理由は?これらが物理ファイルの要求である場合、Apacheはリソースを提供するために暗黙的に複数のスラッシュを減らします。したがって/foo//bar////baz.html/foo/bar/baz.htmlと同じものを返します。だから、それは「良い」です。しかし、これらは技術的に異なるURLなので、重複コンテンツと検索エンジンによって認識される可能性があります。他の目的のためにURLを解析している場合、アプリケーションを中断する可能性もあります。これは問題である場合とそうでない場合があります。それは複数必要で、これは間違ってなど(何かがこれらのURLが生成されているが生じたウェブアプリで破った場合を除きます。)


が、私はこの方法が特に効率的ではないことを追加することになりますへのリンクをユーザーが必要となります追加のスラッシュがたくさんある場合は、外部リダイレクトを使用します(これは、とにかくエッジケースをキャッシュすることのみを目的としています)。例えば、要求が与えられると、次のリダイレクトが発生します。

  1. (初期リクエスト/リダイレクト)
  2. /foo//bar/baz(リダイレクト)
  3. /foo//bar//baz(リダイレクト)
  4. /foo//bar///baz(リダイレクト)
  5. /foo/bar/baz
+1

ああ、そうです。最初の 'RewriteRule' argは置換される正規表現ではありませんが、2番目のargに変換するURLのセットをフィルタリングする正規表現です。ありがとう! –

+2

はい100% –

+0

はい、 'RewriteRule' _pattern_は、ディレクティブが適用されるURLを制限します。理想的には、これはできるだけ制限的でなければなりません。これはファイル内の 'RewriteCond'指示文の前に処理される最初のものです。 URLに複数のスラッシュがないかどうかをチェックする「理由」について私の答えに少し追加しました。 – MrWhite

3

MrWhite has explained very nicely問題のルールの解釈。しかし、複数のスラッシュを含むURLがWebサーバーに送信されたときなどには、まだ問題があります。 。あなたのルールはリダイレクトを5回引き起こしてから、/foo/bar/bazに解決されます。

1つのリダイレクトでこれを行うには、何がルールになるべきかについての彼の答えの下のコメントセクションにいくつかの議論があります。ここで

単一リダイレクトに単一のスラッシュURLにすべての複数のスラッシュのURLを削除するルールです:

RewriteEngine On 

RewriteCond %{REQUEST_URI} // 
RewriteRule ^.*$ /$0 [R=301,L,NE] 

それは、すでに複数のスラッシュを取得RewriteRuleディレクティブからマッチしたパターンの後方参照を使用していますmod_rewriteエンジンによる無料試合。

関連する問題