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)にマップする必要があるためです。