前言

最近在整理之前写的项目,想上一下演示网址,但又不想为每个项目都配置一个域名。

打算全放到 demo.fosky.top 这个域名下。

便研究起了如何配置 Nginx,以便让 thinkphp 在二级目录下运行。

目录结构

demo.fosky.top
├─reg
│ ├─application
│ ├─config
│ ├─extend
│ ├─public
│ │ │─static
│ │ │ └─css
│ │ └─index.php
│ ├─route
│ ├─runtime
│ └─thinkphp
├─shop
│ ├─application
│ ├─config
│ ├─extend
│ ├─public
│ │ └─static
│ ├─route
│ ├─runtime
│ └─thinkphp
└─zy

研究过程

百度了蛮久的,但找到的教程都和 tp 的文档上写的差不多 URL访问 · ThinkPHP5.1完全开发手册 · 看云 (kancloud.cn)

thinkphp 在二级目录运行如何配置伪静态

便尝试着配置了下。

但是呢,我的运行目录在 public,我又不想改入口文件位置,毕竟那样我需要另外设置规则来屏蔽目录访问。

那大家可能会说了,把文档里的规则改改,加上 public 不就好了吗?

thinkphp 在二级目录运行如何配置伪静态

但这样会有个问题,直接访问目录显示 404。

thinkphp 在二级目录运行如何配置伪静态

后面加上模块名才能访问,这就很屮了。

thinkphp 在二级目录运行如何配置伪静态

所以还是得研究怎么改。

后面我想到,只要访问路径和二级目录名一样时,rewrite 到 index.php 不久好了吗?

thinkphp 在二级目录运行如何配置伪静态

果然设置之后就可以了。

但是还是有问题的,因为我的 public 目录下是有 static 目录来存放静态文件的,但由于项目目录下找不到文件,所以它就直接 rewrite 到 index.php 了,然后就会提示模块不存在,并返回 404 错误码。

thinkphp 在二级目录运行如何配置伪静态thinkphp 在二级目录运行如何配置伪静态

然后我想到可以再加条匹配规则,检测到访问路径中有 static,就 rewrite 到 /public/static 去访问文件。

thinkphp 在二级目录运行如何配置伪静态thinkphp 在二级目录运行如何配置伪静态

这样问题就解决了。

当然也可以匹配文件后缀名。

thinkphp 在二级目录运行如何配置伪静态

10.7 补充

在本地测试部署另一个项目时,发现如果像这样有查询字符串,就会 404

thinkphp 在二级目录运行如何配置伪静态

所以我们不能单纯的只判断全等,这里我改成了用正则匹配

thinkphp 在二级目录运行如何配置伪静态

这样就可以正常访问了

thinkphp 在二级目录运行如何配置伪静态