thinkcmf5.1默认是public目录,但是部署到虚拟主机安装步骤不能放在public目录,而是所有文件部署到主机根目录,目录结构需要修改,下面教大家怎么修改并部署到阿里云之类虚拟主机。
方法一:(直接利用伪静态文件 .htaccess 重写路由)
1. 在根目录新起个 .htaccess 文件,
2. 往新建的文件里面写入以下内容:
apache
<IfModule mod_rewrite.c> Options +FollowSymlinks -Multiviews RewriteEngine On RewriteBase / RewriteCond %{REQUEST_URI} !^/public/ RewriteRule ^(.*)$ public/$1 [L,QSA] </IfModule>
nginx
location / { index index.php index.html index.htm; #如果请求既不是一个文件,也不是一个目录,则执行一下重写规则 if (!-e $request_filename) { #地址作为将参数rewrite到index.php上。 #rewrite ^/(.*)$ /index.php?s=$1; #若是子目录则使用下面这句,将subdir改成目录名称即可。 rewrite ^/public/(.*)$ /public/index.php?s=$1; } } location /api/ { index index.php index.html index.htm; #如果请求既不是一个文件,也不是一个目录,则执行一下重写规则 if (!-e $request_filename) { #地址作为将参数rewrite到index.php上。 #rewrite ^/(.*)$ /index.php?s=$1; #若是子目录则使用下面这句,将subdir改成目录名称即可。 rewrite ^/api/(.*)$ /api/index.php?s=$1; } }
3. 刷新直接访问即可
4.还是访问不了, 那么就是 public 下面的.htaccess 有问题, (此种方法, 路由中会多出个 /public )
方法二(推荐):(移动 public 目录下的文件,并修改index.php 及 api.php 的内容)
1. 把public里面的文件全部移动都根目录,
2. 找到 index.php 和 api.php 里的 "define('CMF_ROOT', dirname(__DIR__) . '/');" 修改为 "define('CMF_ROOT', __DIR__ . '/thinkcmf/'); "
3. api.php的还要把 "require __DIR__ . '/../vendor/thinkphp/base.php;" 改为 "require CMF_ROOT . 'vendor/thinkphp/base.php';"
4.将除public下文件和目录,所有app目录和api目录,vendor目录,统一放到thinkcmf目录里
5. 刷新访问即可.
index.php入口文件内容如下:
<?php namespace think; // [ 入口文件 ] // 调试模式开关 define('APP_DEBUG', true); // 定义CMF根目录,可更改此目录 define('CMF_ROOT', __DIR__ . '/thinkcmf/');// ayumi改过了 // 定义CMF数据目录,可更改此目录 define('CMF_DATA', CMF_ROOT . 'data/'); // 定义应用目录 define('APP_PATH', CMF_ROOT . 'app/'); // 定义网站入口目录 define('WEB_ROOT', __DIR__ . '/'); // 加载基础文件 require CMF_ROOT . 'vendor/thinkphp/base.php'; // 执行应用并响应 Container::get('app', [APP_PATH])->run()->send();
api.php 入口文件内容如下:
<?php namespace think; // [ 入口文件 ] // 调试模式开关 define('APP_DEBUG', true); // 定义CMF根目录,可更改此目录 define('CMF_ROOT', __DIR__ . '/thinkcmf/');// ayumi改过了 // 定义CMF数据目录,可更改此目录 define('CMF_DATA', CMF_ROOT . 'data/'); // 定义应用目录 define('APP_PATH', CMF_ROOT . 'api/'); // 定义路由目录 define('ROUTE_PATH', APP_PATH . 'route.php'); // 定义配置目录 define('CONFIG_PATH', CMF_ROOT . 'data/config/'); // 定义命名空间 define('APP_NAMESPACE', 'api'); // 定义网站入口目录 define('WEB_ROOT', __DIR__ . '/'); // 加载基础文件 require CMF_ROOT . 'vendor/thinkphp/base.php'; // 执行应用并响应 Container::get('app', [APP_PATH])->run()->send();
伪静态保持原来不变;
apache
<IfModule mod_rewrite.c> Options +FollowSymlinks -Multiviews RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^api/?(.*)$ api.php?s=$1 [QSA,PT,L] RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php?s=$1 [QSA,PT,L] </IfModule>
nginx:
location / { index index.php index.html index.htm; #如果请求既不是一个文件,也不是一个目录,则执行一下重写规则 if (!-e $request_filename) { #地址作为将参数rewrite到index.php上。 #若是子目录则使用下面这句,将subdir改成目录名称即可。 rewrite ^(.*)$ /index.php/$1 last; } } location /api/ { index index.php index.html index.htm; #如果请求既不是一个文件,也不是一个目录,则执行一下重写规则 if (!-e $request_filename) { #地址作为将参数rewrite到index.php上。 #若是子目录则使用下面这句,将subdir改成目录名称即可。 rewrite ^/api/(.*)$ /api.php?s=$1 last; } }