Webサーバー

通常、フロントコントローラーパターンを使用して、Webサーバーが受信した適切なHTTPリクエストを単一のPHPファイルに送ります。以下の説明では、HTTPリクエストをPHPフロントコントローラーファイルに送信するようにWebサーバーに指示する方法を説明します。

PHP組み込みサーバー

ターミナルで次のコマンドを実行して、ローカルホストWebサーバーを起動します。./public/index.phpファイルのある一般公開ディレクトリであると仮定します。

cd public/
php -S localhost:8888

index.phpをエントリポイントとして使用していない場合は、適宜変更してください。

警告: 組み込みWebサーバーは、アプリケーション開発を支援するために設計されました。また、制御された環境で実行されるテスト目的またはアプリケーションデモにも役立つ場合があります。フル機能のWebサーバーとして使用することを意図していません。公共ネットワークで使用しないでください。

Apacheの設定

Apache mod_rewriteモジュールがインストールされ、有効になっていることを確認してください。mod_rewriteを有効にするには、ターミナルで次のコマンドを入力します

sudo a2enmod rewrite
sudo a2enmod actions

.htaccessファイルとindex.phpファイルが同じ一般公開ディレクトリにあることを確認してください。.htaccessファイルには、次のコードが含まれている必要があります。

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [QSA,L]

public/ディレクトリがURLに表示されないようにするには、public/ディレクトリの上に、次の内部リダイレクトルールを含む2番目の.htaccessファイルを追加する必要があります。

RewriteEngine on
RewriteRule ^$ public/ [L]
RewriteRule (.*) public/$1 [L]

これらの.htaccessファイルには、URLの書き換えが必要です。

Apacheのmod_rewriteモジュールが有効になっていること、および仮想ホストが.htaccess書き換えルールを使用できるようにAllowOverrideオプションで構成されていることを確認してください。これを行うには、ファイル/etc/apache2/apache2.confをルート権限を持つエディターで開く必要があります。

<Directory ...>ディレクティブをAllowOveride NoneからAllowOveride Allに変更します。

<Directory /var/www/>
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
</Directory>

最後に、Apacheの設定をリロードする必要があります。Apache Webサーバーを再起動するには、次のように入力します

sudo service apache2 restart

このコマンドは、ほとんどのDebian/Ubuntuバリアントで機能します。他のすべてのLinuxディストリビューションについては、特定のLinuxディストリビューションのドキュメントを参照して、Apacheを再起動する方法を確認してください。

サブディレクトリでの実行

この例では、フロントコントローラーがpublic/index.phpにあると仮定しています。

サブディレクトリをフロントコントローラーに「リダイレクト」するには、public/ディレクトリの上に2番目の.htaccessファイルを作成します。

2番目の.htaccessファイルには、次のコードが含まれている必要があります。

RewriteEngine on
RewriteRule ^$ public/ [L]
RewriteRule (.*) public/$1 [L]

また、ルーターがブラウザーからのURLをルート登録で設定されたパスと一致させることができるように、ベースパスを設定することもできます。これは、setBasePath()メソッドを使用して行われます。

$app->setBasePath('/myapp');

詳しくはこちら

Nginxの設定

これは、ドメインexample.comのNginx仮想ホスト構成の例です。ポート80でのインバウンドHTTP接続をリッスンします。ポート9123でPHP-FPMサーバーが実行されていると仮定しています。server_nameerror_logaccess_log、およびrootディレクティブを独自の値で更新する必要があります。rootディレクティブは、アプリケーションのパブリックドキュメントルートディレクトリへのパスです。Slimアプリのindex.phpフロントコントローラーファイルはこのディレクトリにある必要があります。

server {
    listen 80;
    server_name example.com;
    index index.php;
    error_log /path/to/example.error.log;
    access_log /path/to/example.access.log;
    root /path/to/public;

    location / {
        try_files $uri /index.php$is_args$args;
    }

    location ~ \.php {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param SCRIPT_NAME $fastcgi_script_name;
        fastcgi_index index.php;
        fastcgi_pass 127.0.0.1:9123;
    }
}

Caddy

Caddyの設定は/etc/caddy/Caddyfileにあります。Caddyにはphp-fpmが必要で、FPMサーバーが実行されている必要があります。FPMソケットが/var/run/php/php-fpm.sockにあり、アプリケーションが/var/wwwにあると仮定すると、次の構成はそのまま機能するはずです。

任意のリクエストをリッスンするHTTP構成

:80 {
        # Set-up the FCGI location
        php_fastcgi unix//var/run/php/php-fpm.sock
        # Set this path to your site's directory.
        root * /var/www/public
}

自己署名証明書を使用したHTTPS構成

:443 {
        tls internal
        # Set-up the FCGI location
        php_fastcgi unix//var/run/php/php-fpm.sock
        # Set this path to your site's directory.
        root * /var/www/public
}

IIS

Web.configファイルとindex.phpファイルが同じ一般公開ディレクトリにあることを確認してください。Web.configファイルには、次のコードが含まれている必要があります。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="slim" patternSyntax="Wildcard">
                    <match url="*" />
                    <conditions>
                        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
                        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
                    </conditions>
                    <action type="Rewrite" url="index.php" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

lighttpd

lighttpd構成ファイルには、このコード(およびその他の必要な設定)を含める必要があります。このコードには、lighttpd >= 1.4.24が必要です。

url.rewrite-if-not-file = ("(.*)" => "/index.php/$0")

これは、Slimのindex.phpがプロジェクトのルートフォルダ(wwwルート)にあると仮定しています。

サブディレクトリから実行する

仮想ホストを作成する代わりに、サーバーのルートにあるサブディレクトリからSlimアプリケーションを実行する場合は、AppFactory::create();の直後に$app->setBasePath('/path-to-your-app');を設定できます。サーバーのルートが/var/www/html/で、Slimアプリケーションへのパスが/var/www/html/my-slim-appであると仮定すると、ベースパスを$app->setBasePath('/my-slim-app');に設定できます。

<?php

use Slim\Factory\AppFactory;
// ...

$app = AppFactory::create();
$app->setBasePath('/my-slim-app');

// ...

$app->run();