最近在服务器处理项目时,想把多个项目放在服务器的根目录下面,通过根目录的二级目录来访问相对应的项目,主要是为了方面在各个项目里面用不同的SVN来控制各个项目。
但是把项目部署到服务器上了后却出现了路由找不到,返回404的问题,根目录下的基础文件phpinfo可以正常访问,项目里面Public\image目录下面的图片也可以访问到,说明是在服务器部署项目时伪静态失效了,因为windows是在Apache下开发的,nginx下.htaccess文件不生效,当时只写了一级目录下访问的伪静态规则。
- server {
- listen 80;
- server_name test.test.com;
- root /usr/share/nginx/html;
- index index.php index.html;
- location / {
- try_files $uri $uri/ =404;
- if (!-e $request_filename) {
- rewrite ^(.*)$ /index.php?s=$1 last;
- }
- }
- }
后来在网上查找到二级目录需要在location后面添加二级目录名,并且在rewrite规则里面把路由的正则改写,加上二级目录的规则后
- server {
- listen 80;
- server_name test.test.com;
- root /usr/share/nginx/html;
- index index.php index.html;
- location / {
- try_files $uri $uri/ =404;
- if (!-e $request_filename) {
- rewrite ^(.*)$ /index.php?s=$1 last;
- }
- }
- location /projectOne/ {
- try_files $uri $uri/ =404;
- if (!-e $request_filename) {
- rewrite ^projectOne/(.*)$ /projectOne/index.php?s=$1 last;
- }
- }
- }
但是这样配置后访问还是失败,需要使用index.php?m=index&c=index&a=index的路由方式来访问当前控制器,伪静态规则没有生效。后来又思考了下,不生效的原因可能是在rewrite规则里面正则表达式不能识别“/”,后来将正则改了点,另外的一个项目使用的是thinkphp5的框架,入口在三级目录的public下面,将改写的规则放上去后,把thinkphp的路由规则选成'URL_MODEL' => 1, 后两个项目都可以在根目录下使用二级目录来分别控制了。
- server {
- listen 80;
- server_name test.test.com;
- root /usr/share/nginx/html;
- index index.php index.html;
- location / {
- try_files $uri $uri/ =404;
- if (!-e $request_filename) {
- rewrite ^(.*)$ /index.php?s=$1 last;
- }
- }
- location /projectOne/ {
- try_files $uri $uri/ =404;
- if (!-e $request_filename) {
- rewrite ^\/projectOne\/(.*)$ /projectOne/index.php?s=$1 last;
- }
- }
- location /projectTwo/public/ {
- try_files $uri $uri/ =404;
- if (!-e $request_filename) {
- rewrite ^\/projectTwo\/public\/(.*)$ /projectTwo/public/index.php?s=$1 last;
- }
- }
- }
第一个项目
第二个项目