通常、フロントコントローラーパターンを使用して、Webサーバーが受信した適切なHTTPリクエストを単一のPHPファイルに送ります。以下の説明では、HTTPリクエストをPHPフロントコントローラーファイルに送信するようにWebサーバーに指示する方法を説明します。
ターミナルで次のコマンドを実行して、ローカルホストWebサーバーを起動します。./public/がindex.phpファイルのある一般公開ディレクトリであると仮定します。
cd public/
php -S localhost:8888
index.phpをエントリポイントとして使用していない場合は、適宜変更してください。
警告: 組み込みWebサーバーは、アプリケーション開発を支援するために設計されました。また、制御された環境で実行されるテスト目的またはアプリケーションデモにも役立つ場合があります。フル機能のWebサーバーとして使用することを意図していません。公共ネットワークで使用しないでください。
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');
詳しくはこちら
これは、ドメインexample.com
のNginx仮想ホスト構成の例です。ポート80でのインバウンドHTTP接続をリッスンします。ポート9123でPHP-FPMサーバーが実行されていると仮定しています。server_name
、error_log
、access_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の設定は/etc/caddy/Caddyfile
にあります。Caddyにはphp-fpm
が必要で、FPMサーバーが実行されている必要があります。FPMソケットが/var/run/php/php-fpm.sock
にあり、アプリケーションが/var/www
にあると仮定すると、次の構成はそのまま機能するはずです。
: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
}
: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
}
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 >= 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();