最近在服务器处理项目时,想把多个项目放在服务器的根目录下面,通过根目录的二级目录来访问相对应的项目,主要是为了方面在各个项目里面用不同的SVN来控制各个项目。

但是把项目部署到服务器上了后却出现了路由找不到,返回404的问题,根目录下的基础文件phpinfo可以正常访问,项目里面Public\image目录下面的图片也可以访问到,说明是在服务器部署项目时伪静态失效了,因为windows是在Apache下开发的,nginx下.htaccess文件不生效,当时只写了一级目录下访问的伪静态规则。

  1. server {
  2. listen 80;
  3. server_name test.test.com;
  4. root /usr/share/nginx/html;
  5. index index.php index.html;
  6. location / {
  7. try_files $uri $uri/ =404;
  8. if (!-e $request_filename) {
  9. rewrite ^(.*)$ /index.php?s=$1 last;
  10. }
  11. }
  12. }

后来在网上查找到二级目录需要在location后面添加二级目录名,并且在rewrite规则里面把路由的正则改写,加上二级目录的规则后

  1. server {
  2. listen 80;
  3. server_name test.test.com;
  4. root /usr/share/nginx/html;
  5. index index.php index.html;
  6. location / {
  7. try_files $uri $uri/ =404;
  8. if (!-e $request_filename) {
  9. rewrite ^(.*)$ /index.php?s=$1 last;
  10. }
  11. }
  12. location /projectOne/ {
  13. try_files $uri $uri/ =404;
  14. if (!-e $request_filename) {
  15. rewrite ^projectOne/(.*)$ /projectOne/index.php?s=$1 last;
  16. }
  17. }
  18. }

但是这样配置后访问还是失败,需要使用index.php?m=index&c=index&a=index的路由方式来访问当前控制器,伪静态规则没有生效。后来又思考了下,不生效的原因可能是在rewrite规则里面正则表达式不能识别“/”,后来将正则改了点,另外的一个项目使用的是thinkphp5的框架,入口在三级目录的public下面,将改写的规则放上去后,把thinkphp的路由规则选成'URL_MODEL' => 1, 后两个项目都可以在根目录下使用二级目录来分别控制了。

  1. server {
  2. listen 80;
  3. server_name test.test.com;
  4. root /usr/share/nginx/html;
  5. index index.php index.html;
  6. location / {
  7. try_files $uri $uri/ =404;
  8. if (!-e $request_filename) {
  9. rewrite ^(.*)$ /index.php?s=$1 last;
  10. }
  11. }
  12. location /projectOne/ {
  13. try_files $uri $uri/ =404;
  14. if (!-e $request_filename) {
  15. rewrite ^\/projectOne\/(.*)$ /projectOne/index.php?s=$1 last;
  16. }
  17. }
  18. location /projectTwo/public/ {
  19. try_files $uri $uri/ =404;
  20. if (!-e $request_filename) {
  21. rewrite ^\/projectTwo\/public\/(.*)$ /projectTwo/public/index.php?s=$1 last;
  22. }
  23. }
  24. }

第一个项目

第二个项目