通常使用前端控制器模式将 Web 服务器接收到的适当 HTTP 请求汇集到单个 PHP 文件中。下面的说明解释了如何告诉您的 Web 服务器将 HTTP 请求发送到您的 PHP 前端控制器文件。
在终端中运行以下命令以启动 localhost Web 服务器,假设./public/
是带有文件的公共可访问目录index.php
:
cd public/
php -S localhost:8888
如果你不使用index.php
作为你的入口点然后适当地改变。
警告:内置网络服务器旨在帮助应用程序开发。它还可用于测试目的或用于在受控环境中运行的应用程序演示。它无意成为功能齐全的 Web 服务器。它不应该在公共网络上使用。
确保mod_rewrite
安装并启用了 Apache 模块。为了启用,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 中,您应该
使用以下内部重定向规则在目录.htaccess
上方添加第二个文件:public/
RewriteEngine on
RewriteRule ^$ public/ [L]
RewriteRule (.*) public/$1 [L]
这些.htaccess
文件需要重写 URL。
确保启用 Apache 的mod_rewrite
模块,并且您的虚拟主机配置了该AllowOverride
选项,以便.htaccess
可以使用重写规则:为此,/etc/apache2/apache2.conf
必须在具有 root 权限的编辑器中打开文件。
将<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
.
要将子目录“重定向”到前端控制器,请
在目录.htaccess
上方创建第二个文件public/
。
第二个.htaccess
文件应包含以下代码:
RewriteEngine on
RewriteRule ^$ public/ [L]
RewriteRule (.*) public/$1 [L]
您还可以设置基本路径,以便路由器可以将来自浏览器的 URL 与路由注册中设置的路径相匹配。这是通过setBasePath()
方法完成的。
$app->setBasePath('/myapp');
阅读更多
这是域的 Nginx 虚拟主机配置示例example.com
。它在端口 80 上侦听入站 HTTP 连接。它假设 PHP-FPM 服务器在端口 9123 上运行。您应该使用您自己的值更新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")
这假定 Slimindex.php
位于项目的根文件夹中(www root)。
如果您想从服务器根目录中的子目录运行您的 Slim 应用程序而不是创建虚拟主机,您可以$app->setBasePath('path-to-your-app')
在AppFactory::create()
. 假设您的服务器的根目录是/var/www/html/
并且您的 Slim 应用程序的路径是/var/www/html/my-slim-app
您可以将基本路径设置为$app->setBasePath('/my-slim-app')
.
<?php
use Slim\Factory\AppFactory;
use Slim\Middleware\OutputBufferingMiddleware;
// ...
$app = AppFactory::create();
$app->setBasePath('/my-slim-app');
// ...
$app->run();