[解決済み] 参考:mod_rewrite、URLリライト、「プリティリンク」解説
質問
きれいなリンクはよくリクエストされるテーマですが、十分に説明されていることはあまりありません。 mod_rewrite は、"pretty links" を作るひとつの方法ですが、これは複雑で、その構文は非常に簡潔で理解しにくく、ドキュメントではHTTPについてあるレベルの熟練度を想定しています。誰か、"pretty links" がどのように動作し、mod_rewrite がどのようにそれを作成するために使用できるのか、簡単な言葉で説明していただけませんか?
クリーンなURLの他の一般的な名前、エイリアス、用語。 RESTful URL、ユーザーフレンドリーなURL。 SEO -friendly URLs。 スラッギング と、MVCのURL(たぶん誤記)。
解決するには?
mod_rewrite が何をするのかを理解するために、まずウェブサーバがどのように動作するのかを理解する必要があります。ウェブサーバは次のように応答します。 HTTPリクエスト . 最も基本的なレベルのHTTPリクエストは、次のようになります。
GET /foo/bar.html HTTP/1.1
これは、ブラウザからウェブサーバへの単純なリクエストであり、そのリクエストは
URL
/foo/bar.html
を送信します。を要求しないことを強調することが重要です。
ファイル
これは任意のURLを要求するだけである。リクエストは次のようになることもあります。
GET /foo/bar?baz=42 HTTP/1.1
これはURLに対する要求と同じように有効であり、より明らかにファイルとは何の関係もありません。
Webサーバーは、あるポートで待ち受けるアプリケーションで、そのポートから入ってくるHTTPリクエストを受け付け、レスポンスを返します。Webサーバーは、どのようなリクエストに対しても、どのような方法で応答するか、どのような方法で応答するように設定するか、まったく自由です。このレスポンスはファイルではありません。 HTTPレスポンス これは、ディスク上の物理的なファイルとは関係ないかもしれません。ウェブサーバーは Apache である必要はなく、他の多くのウェブサーバーがあり、それらはすべて持続的に動作し、HTTP リクエストに応答するポートに接続された単なるプログラムです。自分で書くこともできます。このパラグラフは、URLが直接ファイルに等しいという概念からあなたを切り離すことを意図したもので、理解する上で本当に重要なことです :)
ほとんどのWebサーバーのデフォルトの設定は、ハードディスク上にあるURLと一致するファイルを探すことです。もし
ドキュメントルート
に設定されている場合、例えば、サーバーの
/var/www
というファイルがあるかどうかを調べることがあります。
/var/www/foo/bar.html
が存在する場合、それを提供する。ファイルの末尾が ".php" である場合、PHP インタープリタを起動して
では
その結果を返す。この関連付けはすべて完全に設定可能です。WebサーバーがPHPインタープリターを介してファイルを実行するために、ファイルは".php"で終わる必要はありませんし、何かが起こるためにURLはディスク上の特定のファイルに一致する必要はありません。
mod_rewrite は
リライト
は、内部のリクエスト処理を行います。ウェブサーバがURLのリクエストを受けると
/foo/bar
を使用することができます。
リライト
という URL を別のものに変えてから、ウェブサーバはそれにマッチするディスク上のファイルを探します。簡単な例です。
RewriteEngine On
RewriteRule /foo/bar /foo/baz
このルールでは
リクエストが "/foo/bar" にマッチするときはいつでも、それを "/foo/baz" に書き換えてください。
その後、リクエストは以下のように処理されます。
/foo/baz
が代わりにリクエストされました。これは例えば様々な効果に利用することができます。
RewriteRule (.*) $1.html
このルールは、あらゆるもの (
.*
) と
キャプチャ
それ(
(..)
を追加するように書き換えています。つまり、もし
/foo/bar
がリクエストされたURLであった場合、それはあたかも
/foo/bar.html
が要求されていた。参照
http://regular-expressions.info
は、正規表現のマッチング、キャプチャ、および置換についての詳細です。
また、よく遭遇するルールとして、こんなものがあります。
RewriteRule (.*) index.php?url=$1
これもまた、何かにマッチして、index.php ファイルに書き換えられ、元々リクエストされた URL が
url
クエリパラメータを指定します。つまり、入ってくるすべてのリクエストに対して、index.phpというファイルが実行され、このファイルは元のリクエストの
$_GET['url']
だから、何でもできるんです。
主に、このリライトルールを
ウェブサーバー設定ファイル
. また、Apache では、これらのファイルを
.htaccess
をドキュメントルート内 (すなわち、.php ファイルの隣) に置いてください。
<サブ * もし は、Apache の主設定ファイルで許可されています; オプションですが、しばしば有効になります。
mod_rewrite が行うこと ではなく する
mod_rewrite は、魔法のようにすべての URL を "pretty"にするわけではありません。これはよくある誤解です。もしあなたのウェブサイトにこのようなリンクがあれば
<a href="/my/ugly/link.php?is=not&very=pretty">
は、それをきれいにするために mod_rewrite ができることは何もありません。これをきれいなリンクにするためには、そうしなければなりません。
-
リンクをプリティリンクに変更します。
<a href="/my/pretty/link">
-
サーバーで mod_rewrite を使用して、URL へのリクエストを処理します。
/my/pretty/link
のいずれかを使用してください。
(を使用することができます。
mod_substitute
を併用することで、発信するHTMLページとその中に含まれるリンクを変換することができます。ただし、これは通常、HTMLリソースを更新するよりも手間がかかります)。
mod_rewrite ができることはたくさんあり、いくつかの書き換えを連鎖させたり、 リクエストを全く別のサービスやマシンにプロキシしたり、 特定の HTTP ステータスコードをレスポンスとして返したり、 リクエストをリダイレクトしたりと、非常に複雑なマッチングルールを作成することができます。これは非常に強力で、基本的な HTTP リクエスト・レスポンス機構を理解していれば、非常に有効に使うことができます。その機能は ではない は、自動的にリンクをきれいにすることができます。
をご覧ください。 公式ドキュメント は、使用可能なすべてのフラグとオプションについて説明します。
関連
-
[解決済み] エラーメッセージ "Forbidden You don't have permission to access / on this server" [closed].
-
[解決済み] Apache 2.2 で mod_rewrite を有効にする方法
-
[解決済み] エラー」を解決する方法 Apacheが予期せずシャットダウンしました" を解決するには?
-
[解決済み】.htaccessとmod_rewriteで強制的にSSL/https化する。
-
[解決済み] VirtualHostの追加に失敗する。Access Forbidden Error 403 (XAMPP) (Windows 7)
-
[解決済み] PHPで500 Internal Server Errorを出さずにエラーを表示させる方法【重複あり
-
[解決済み] PHPによるURLリライト
-
[解決済み] XAMPPのapacheサーバーのポートを変更する方法は?
-
[解決済み] Apacheの内部エラー500、しかしログには何もない?
-
[解決済み] Apacheのアクセスログを理解する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] エラー」を解決する方法 Apacheが予期せずシャットダウンしました" を解決するには?
-
[解決済み] ApacheとNode.jsを同じサーバーで使う
-
[解決済み] HTTPSをHTTPにリダイレクトするにはどうしたらいいですか?
-
[解決済み] PHPで500 Internal Server Errorを出さずにエラーを表示させる方法【重複あり
-
[解決済み] ApacheをNode.jsで置き換えることはできますか?
-
[解決済み] .htaccess ErrorDocument 404が表示されない
-
[解決済み] Apache httpd (MAMP)でhttpファイルのキャッシュを行わないようにする方法
-
[解決済み] Apacheの内部エラー500、しかしログには何もない?
-
[解決済み] プレフォークウェブサーバーモデルとは何ですか?
-
[解決済み] ローカルネットワークのユーザーが私のWAMPサイトにアクセスできるようにするには?