由于实际工作需求(其实就是因为公司服务偏java)
要求项目必须以ip/目录
的方式开展。(解决方法看2即可)
而thinkphp5默认要求搭建在顶级目录下。这就坑了。
于是用了3天找出解决方案。
网上也有不少好的参考案例,再次记下。
参考apache改.htaccess文件解决。
参考 阿里云虚拟主机部署TP5项目绑定二级目录解决办法
.htaccess改为:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_URI} !^/public/
RewriteRule ^(.*)$ public/$1?Rewrite [L,QSA]
</IfModule>
如果需要指定域名则增加
RewriteCond %{HTTP_HOST} ^www\.xxx\.com$ [NC]
这里记得public这个关键字,RewriteRule ^(.*)$ public/$1?Rewrite [L,QSA]
这一部分tp5不一样,注意区分。
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /域名的二级目录/
RewriteCond %{REQUEST_URI} !^/public/
RewriteRule ^(.*)$ public/$1?Rewrite [L,QSA]
</IfModule>
上nginx
首先确定域名二级目录名称:10.X.X.X/aaa/
直接上nginx.conf部分内容
server {
listen 8081;
server_name 10.X.X.X;
root D:/phpstudy_pro/WWW/aaa/public;
index index.html index.htm index.php;
location ~ \.php(.*)$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
#下面两句是给fastcgi权限,可以支持 ?s=/module/controller/action的url访问模式
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
#下面两句才能真正支持 index.php/index/index/index的pathinfo模式
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
include fastcgi_params;
}
location /aaa/ {
index index.html index.htm index.php;
#autoindex on;
if (!-e $request_filename) {
rewrite ^/aaa/(.*)$ /aaa/index.php?s=/$1 last;
break;
}
}
location ~ .*\.(css|js|gif|jpg|jpeg|png|bmp|swf)$ {
root D:/phpstudy_pro/WWW/aaa/public;
expires 30d;
}
add_header Content-Security-Policy "default-src 'self' 'unsafe-eval' 'unsafe-inline' fonts.gstatic.com data:;img-src 'self' 'unsafe-eval' 'unsafe-inline' data: blob: ;style-src * 'self' 'unsafe-eval' 'unsafe-inline' fonts.gstatic.com data:";
add_header X-Content-Type-Options: nosniff;
add_header X-XSS-Protection "1; mode=block";
#add_header Access-Control-Allow-Origin: http://www.one.site.com;
#add_header X-Frame-Options: deny;
#add_header Strict-Transport-Security: max-age=3600; includeSubDomains;
}
注意修改部分:
listen 8081;//端口,默认应该是80
server_name 10.X.X.X;//这里应该是域名,或者ip
root D:/phpstudy_pro/WWW/aaa/public;//这里就是项目名,正常就该这么写
rewrite ^/aaa/(.*)$ /aaa/index.php?s=/$1 last;//修改重写路径,这里第一个aaa对应的是url路径。第二个aaa对应的是你public的路径,说实话,第二个aaa可以不用。
root D:/phpstudy_pro/WWW/aaa/public;//这句话意思是相关扩展名的文件的路径,这个aaa应该是上一行的第二个aaa
然后,我将public当中所有的目录都改到了public/aaa下,同时修改index.php和router.php
index.php
<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st
// +----------------------------------------------------------------------
// [ 应用入口文件 ]
// 定义应用目录
define('APP_PATH', __DIR__ . '/../../application/');
// 加载框架引导文件
require __DIR__ . '/../../thinkphp/start.php';
router.php
<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st
// +----------------------------------------------------------------------
// $Id$
if (is_file($_SERVER["DOCUMENT_ROOT"] . $_SERVER["SCRIPT_NAME"])) {
return false;
} else {
if (!isset($_SERVER['PATH_INFO'])) {
$_SERVER['PATH_INFO'] = $_SERVER['REQUEST_URI'];
}
require __DIR__ . "../index.php";
}
ps:由于个人对nginx不是很了解,所以硬扛上线的。
总之:就是改nginx的rewrite、在public下新建前端目录,并改public下的php增加…/
另外,我会抽空测试不改public,只改nginx的方法。
求大神评论。
(问我为啥不用apache?因为phpstudy8.1的apache不认header头,.htaccess不认识header,老报错【其实可能是我不懂具体格式】,所以换了nginx,简单,粗暴~)
记录时间:20200228