34

.htaccessを使用してURLをリダイレクトすることと書き換えることの違いを理解したいと思います。例を次に示します。次のようなリンクがあるwww.abc.com/ index.php?page=product_types&cat=88 とします(これを「元の」URLと呼びます)

ただし、ユーザーが入力するときabc.com/shoes(これを「目的の」URLと呼びましょう)、上記のリンクの内容を確認する必要があります。これを達成するために、私はこれを行います:

Options +FollowSymLinks
RewriteEngine on
RewriteBase /
RewriteRule ^(.*)shoes(.*)$ index.php?page=product_types&cat=88

このコードには何の問題もありません。ただし、アドレスバーに元のURLを入力すると、コンテンツは表示されますが、URLは変更されません。だからそれはwww.abc.com/index.php?page=product_types&cat=88

/shoesしかし、入力した場合に目的のURL()をアドレスバーに表示したい場合はどうなりwww.abc.com/ index.php?page=product_types&cat=88ますか?これは.htaccessを使用してどのように達成されますか?潜在的なループに遭遇していますか?

4

1 に答える 1

44

説明の一部はここにあります: https://stackoverflow.com/a/11711948/851273

要点は、書き換えはサーバー上でのみ行われ、クライアント (ブラウザー) はそれに気付かないということです。ブラウザはリクエストを送信してコンテンツを取得しますが、リクエストを処理するためにサーバーで何が起こったのかは賢明ではありません。

リダイレクトは、リクエストに対するサーバーの応答であり、クライアント (ブラウザ) に新しいリクエストを送信するように指示します。ブラウザーは URL を要求します。この URL はロケーション バーにあるものです。サーバーはその要求を取得し、リダイレクトで応答します。ブラウザーは応答を取得し、サーバーの応答に URL を読み込みます。ロケーション バーの URL が新しい URL になり、ブラウザーは新しい URL の要求を送信します。

サーバー上で内部的に書き換えるだけでは、実際の URL には何の影響もありません。google、reddit、またはその他のサイトに へのリンクがあるwww.abc.com/index.php?page=product_types&cat=88場合、内部サーバーの書き換えルールは、そのリンクをクリックした人、または何らかの理由でたまたまその URL を要求したクライアントに対してまったく何もしません。書き換えルールが行うことは、サーバー内に含まshoesれるものを内部的に変更することだけです。/index.php?page=product_types&cat=88

すべてのクエリ文字列を含む index.php ページに対してリクエストが行われるようにしたい場合は、クライアント (ブラウザ) に見栄えの良い URLにリダイレクトするように指示できます。書き換えルールがループし、リダイレクトが内部的に書き換えられるため、注意が必要です。これにより、内部的に書き換えられるリダイレクトが発生し、ループが発生して 500 サーバー エラーがスローされます。したがって、リクエスト自体に具体的に一致させることができます:

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\?page=product_types&cat=88
RewriteRule ^/?index.php$ /shoes [L,R=301]

これは、野生のリンクが正しい場所を指すようにするためにのみ使用する必要があります。コンテンツが正しいリンクを生成していることを確認する必要があります。つまり、サイトのすべてが/shoesリンクではなくリンクを使用していることになります/index.php?page=product_types&cat=88

于 2012-09-13T05:01:47.890 に答える