あなたの質問にもっと徹底的に取り組むために、私はあなたの注意を一時的にウェブサーバーから離れて、HTTPプロトコルとそれが基本的にどのように機能するかに向けたいと思います。
HTTPは、REQUEST-RESPONSEモデルで構成される非常に単純なプロトコルです。クライアント(基本的にはユーザーのブラウザ)は、HTTPリクエストヘッダーと呼ばれるものを送信します。このヘッダーには、空でないHTTPリクエスト本文がある場合とない場合があります。https://stackoverflow.com/questions/tagged/url+phpのようなURLにアクセスする場合、ヘッダーは次のようになります。
GET /questions/tagged/url+php HTTP/1.1
Host: stackoverflow.com
Connection: keep-alive
HTTPリクエストヘッダーの1行目で、stackoverflowサーバーに送信するためにブラウザが作成することに注意してください。この行全体は、3つの非常に単純な部分で構成されています。
- リクエスト動詞。通常はGETやPOSTのようなものです(ただし、他の多くのものもあります)。これは、サーバーが応答することを期待するように、要求をどのように処理するかをサーバーに指示します。
- リクエストパス。ホストが受け入れる任意のパスと、クライアントが提供するオプションのクエリ文字列で構成でき、通常はURLエンコードする必要があります。
- リクエストが行われたプロトコルバージョン。これは通常、HTTP/1.1またはHTTP/1.0のいずれかです。
この要求の2行目は、クライアントがこの要求で到達しようとしているホスト名をサーバーに提供します。
これで、サーバー側では、Webサーバーがこの実際の要求を受信すると、その要求を処理することを選択できます。ただし、一般的なapache / nginx / lighttpd Webサーバーのセットアップでおそらくよく使用される動作は、クライアントによって提供されるパスがドキュメントのルートディレクトリ内の物理パスと一致する必要があることです。これは真実からほど遠いです。これは、Webサーバーがリクエストを処理できる唯一の方法です。各リクエストを異なる方法で処理するようにWebサーバーに指示することを選択できます。
例として、Apacheのhttpd Webサーバーはmod_rewriteを提供します。これは、サーバーが正規表現や特定の条件セットなどの特定のルールに基づいて要求URIを別の場所にリダイレクトできるように、要求URIを書き換えるようにWebサーバーに指示できます。
<Directory />
Options -Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
Allow from all
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</Directory>
上記は、WordPressの書き換えルールが通常.htaccessファイルを提供するように見える非常に単純な例です。ただし、代わりに仮想ホストファイルからこれを取得しました。これは、通常、.htaccessを使用するよりもはるかに高速です。.htaccessを使用することを決定する前に、.htaccessに入れたいものをapache.confのvhostDirectory
ディレクティブに入れることを常に検討してください。これらはランタイムファイルであり、本質的に低速です。一般的に言えば、mod_rewrite自体は遅いので、最後の手段としてのみ使用する必要があります。
いずれにせよ、この書き換え作業はすべて、そのvhostsのルートディレクトリにあるWebサーバーに着信DocumentRoot
する要求をリダイレクトしてindex.phpファイルにリダイレクトし、その要求を内部で処理して、どのPHPスクリプトを含めるかを決定します。このリクエストとページのレンダリング方法。
これは貧乏人のやり方です。これは通常、フロントコントローラーまたはフロントルーターと呼ばれます。これは、リクエストURIと、特定のリクエストURIに対するレスポンスのレンダリングを処理する実際の方法との間の仲介役として機能します。
あなたがstackoverflowまたはgoogleの場合、これらのリクエストをはるかに高いレベルで処理し、データセンター内の他のサーバーに到達して、そのリクエストURIに基づいてリクエストのレンダリングを処理するリバースプロキシ(基本的にロードバランサー)があります。
GET /questions/tagged/url+php HTTP/1.1
私たちが行ったのは、クライアントのHTTPリクエストヘッダーの一部を取り、それに応答する方法を知っている別のスクリプトまたはプログラムに送信することだけだったことを思い出してください。あなたのウェブサーバーがあなたのためにできるのと同じように。