基本的な Apache mod_rewrite
機能は、app.yaml
から参照される PHP スクリプトを使用してシミュレートできます。その際に、目的のスクリプトが読み込まれます。この例では、変数 $_GET['q']
にリクエストパスが含まれることが予期される一般的な PHP パターンをシミュレートします。
mod_rewrite.php
の概要
mod_rewrite 機能を有効にするには、アプリケーションに mod_rewrite.php
を含めます。アプリケーションに対してリクエストが送信されると、このスクリプトが呼び出され、リクエストのルーティングを実行します。コメントに記述されているように、このスクリプトはルートレベルに PHP スクリプトがあるかどうかを確認します。スクリプトが見つかると、$_GET['q']
変数の $_SERVER['REQUEST_URI']
のパス部分を置き換え、スクリプトを呼び出します。
<?php /** * @file * Provide basic mod_rewrite like functionality. * * Pass through requests for root php files and forward all other requests to * index.php with $_GET['q'] equal to path. The following are examples that * demonstrate how a request using mod_rewrite.php will appear to a PHP script. * * - /install.php: install.php * - /update.php?op=info: update.php?op=info * - /foo/bar: index.php?q=/foo/bar * - /: index.php?q=/ */ $path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH); // Provide mod_rewrite like functionality. If a php file in the root directory // is explicitly requested then load the file, otherwise load index.php and // set get variable 'q' to $_SERVER['REQUEST_URI']. if (dirname($path) == '/' && pathinfo($path, PATHINFO_EXTENSION) == 'php') { $file = pathinfo($path, PATHINFO_BASENAME); } else { $file = 'index.php'; // Provide mod_rewrite like functionality by using the path which excludes // any other part of the request query (ie. ignores ?foo=bar). $_GET['q'] = $path; } // Override the script name to simulate the behavior without mod_rewrite.php. // Ensure that $_SERVER['SCRIPT_NAME'] always begins with a / to be consistent // with HTTP request and the value that is normally provided. $_SERVER['SCRIPT_NAME'] = '/' . $file; require $file;
サンプルアプリ
次に示す例は、$_GET['q']
を確認する非常に単純なアプリケーションです。
app.yaml
app.yaml
ファイルに記述されているように、このアプリケーションにはルートレベルに 2 つの PHP スクリプトがあり、downloads
という名前のディレクトリから静的ファイルを提供します。
application: mod_rewrite_simulator version: 1 runtime: php55 api_version: 1 handlers: # Example of handler which should be placed above the catch-all handler. - url: /downloads static_dir: downloads # Catch all unhandled requests and pass to mod_rewrite.php which will simulate # mod_rewrite by forwarding the requests to index.php?q=... (or other root-level # PHP file if specified in incoming URL. - url: /.* script: mod_rewrite.php
index.php
index.php
はルーター スタイルの index.php
で、これが $_GET['q']
を読み込み、リクエストパスを判断します。
<?php if ($_GET['q'] == '/help') { echo 'This is some help text.'; exit; } echo 'Welcome to the site!';
other.php
次のサンプルは、直接呼び出し可能なルートレベルのスクリプトの例です。多くの PHP フレームワークには、同じように動作するinstall.php
やupdate.php
のようなスクリプトがあります。
<?php echo 'Welcome to the other site.';
リクエストの例
上のアプリケーションでは、リクエストが次のように処理されます。
/
は$_GET['q'] = '/'
でindex.php
に変換されます/help
は$_GET['q'] = '/help'
でindex.php
に変換されます/other.php
は$_GET['q'] = null
でother.php
に変換されます/downloads/foo_17.png
はdownloads/foo_17.png
に変換されます
mod_rewrite.php
が必要になる状況を回避する
多くの PHP フレームワークは $_GET['q']
に依存しなくなりました。代わりに、$_SERVER['REQUEST_URI']
を使用します。これは mod_rewrite
の有無に関係なく機能します。したがって、App Engine では、後者が推奨の方法になります。
mod_rewrite.php
で使用されているように、REQUEST_URI
を利用する簡単な方法は次のようになります。
<?php $path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH); if ($path == '/help') { echo 'This is some help text.'; exit; } echo 'Welcome to the site!';