PHP バージョン 5.5 はコミュニティでサポートを終了したため、新しいアプリでは PHP 7 ランタイムを使用することを強くおすすめします。

Apache mod_rewrite ルーティングをシミュレートする

基本的な Apache mod_rewrite 機能は、app.yaml から参照される PHP スクリプトを使用してシミュレートできます。その際に、目的のスクリプトが読み込まれます。この例では、変数 $_GET['q'] にリクエストパスが含まれることが予期される一般的な PHP パターンをシミュレートします。

mod_rewrite.php の概要

mod_rewrite 機能を有効にするには、アプリケーションに mod_rewrite.php を含めます。アプリケーションに対してリクエストが送信されると、このスクリプトが呼び出され、リクエストのルーティングを実行します。コメントに記述されているように、このスクリプトはルートレベルに PHP スクリプトがあるかどうかを確認します。スクリプトが見つかると、$_GET['q'] 変数の $_SERVER['REQUEST_URI'] のパス部分を置き換え、スクリプトを呼び出します。

 * @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 ファイルに記述されているように、このアプリケーションにはルートレベルに 2 つの PHP スクリプトがあり、downloads という名前のディレクトリから静的ファイルを提供します。

application: mod_rewrite_simulator
version: 1
runtime: php55
api_version: 1

# 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 で、これが $_GET['q'] を読み込み、リクエストパスを判断します。


if ($_GET['q'] == '/help') {
  echo 'This is some help text.';

echo 'Welcome to the site!';


次のサンプルは、直接呼び出し可能なルートレベルのスクリプトの例です。多くの PHP フレームワークには、同じように動作するinstall.phpupdate.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.pngdownloads/foo_17.pngに変換されます

mod_rewrite.php が必要になる状況を回避する

多くの PHP フレームワークは $_GET['q'] に依存しなくなりました。代わりに、$_SERVER['REQUEST_URI'] を使用します。これは mod_rewrite の有無に関係なく機能します。したがって、App Engine では、後者が推奨の方法になります。

mod_rewrite.php で使用されているように、REQUEST_URI を利用する簡単な方法は次のようになります。


$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);

if ($path == '/help') {
  echo 'This is some help text.';

echo 'Welcome to the site!';