4

私はいくつかのURLを書き直すために以下のコードを使用しています:

RewriteEngine On
Options +FollowSymlinks
RewriteBase /
RewriteRule ^New_Hampshire/[a-zA-Z0-9_+\-\s]*\.html$ NH/

その下にもこのルールがあることに注意してください。

RewriteRule ^([a-zA-Z]{2})/ state.php?state=$1 [L]

さて、私が達成したいのは、誰かが例えば次のように行った場合です。

www.mydomain.com/New_Hampshire/index.html

ロケーションバーに次の情報を表示したい:

www.mydomain.com/NH/

通常[R]、最後にフラグを使用することでこれを達成できますが、この場合は機能しません。これは、2次ルールと関係がある可能性があると推測しています。

これは可能ですか?

また、リダイレクトするようにこれを変更するにはどうすればよいですか?

www.mydomain.com/New_Hampshire/

ご覧のとおり、上記には参照が含まれていませんindex.html

301最後に、これらのリダイレクトを作成したい場合は、次のようなことをしますか。

RewriteRule ^New_Hampshire/[a-zA-Z0-9_+\-\s]*\.html$ NH/ [R=301]
4

1 に答える 1

3

URLリライト(この場合はApacheのmod_rewriteによって実現)とリダイレクトの違いを理解する必要があります。リダイレクトはHTTP仕様の一部であり、標準のHTTPヘッダーとステータスコードをクライアント(ブラウザー)に送信することで実現されます。

URL書き換えを使用すると、要求がWebサーバーによって処理されるときに、クライアントから送信された要求されたURLを、別のローカルパスで表されるローカルリソースにマップするオプションがあります。これは、クリーンで短いURLをユーザーに提示できる、サーバー上のリソースの内部構造を非表示にできる、特定のリソースを保護できるなど、さまざまな理由で行われます。

ブラウザは通常、URLがサーバーによって書き直されたことを認識せず(他に何らかの指示がない限り)、アドレスバーに元の要求されたURLを表示します。クライアントが知らないうちに、クライアントが要求したURLをリモートで操作することはできません。

一方、HTTPリダイレクトはHTTP仕様の一部であり、要求されたURLが別の場所にあることをクライアントに通知する方法です。Webサーバーは、リダイレクトされたURLとクライアントに何が起こったかを通知するHTTPステータスコードを含む「Location」ヘッダーを送信することでこれを行います。これにはいくつかの30xステータスコードがあります。最も一般的に使用されるのは、リソースが永続的に移動されたため、今後は新しいURLでアドレス指定する必要があることをクライアントに通知するための301と、リソースが見つかったが一時的なものであることをブラウザに通知するための302です。新しいURLの下に存在します(ルールでRフラグを指定すると、Apacheの実装はデフォルトで302を使用します)。

クライアントは、新しい場所とステータスコードを含むHTTP応答を受信し、新しいURLに新しいHTTPリクエストを発行します。これがメインリクエストである場合(つまり、画像やスクリプトなどのリソースへのサブリクエストではない場合)、アドレスバーの場所も置き換えられます。

http://httpd.apache.org/docs/current/rewrite/flags.html#flag_rを参照してください

Apacheのドキュメントでは、リダイレクトフラグ([R、L]または[R = 301、L]など)とともにLフラグを使用するようにアドバイスされています。そうしないと、予期しない結果が生じる可能性があります(次のルールを処理し続けるため)。これがおそらく、Rフラグが機能しない理由です。

したがって、次のようなことを行うことができます(単なる例):

RewriteRule ^New_Hampshire.* NH/ [R=301, L]

これにより、クライアントは任意の/ New_Hampshireプレフィックス(* .htmlの有無にかかわらず)URLからNH /にリダイレクトされ、アドレスバーが変更されます。

次に、次のルール:

RewriteRule ^NH/? state.php?state=NH [L]

またはより一般的な:

RewriteRule ^([a-zA-Z]{2})/? state.php?state=$1 [L]

これにより、NH(または他の状態)URLがキャッチされ、適切な実際のリソース(state.php)に書き換えられます。

しかし、これはルールを示すための単なる例です。おそらく、最初のルールのロジックを処理する必要があります。各州のルールを記述したい場合を除いて、何かが完全な州の名前(New_Hampshire)をショートカット(NH)にマップする必要があるためです。

于 2012-11-22T14:04:24.203 に答える