缘起

公司之前一直使用php做后台,沿用的是简学易懂的ci框架。去年下半年起,听取了相关人士的建议,招聘了java。之后java在这个公司崛起了,到现在,php已经没有立足之地,要么转java,要么离职。

boss的想法,php入门容易(这难道有错吗),没有java安全(不知道是谁给他洗的脑),java可以团队化管理(好像php不行似的,这就是不招php的借口?)...等等,他觉得反正相关人士肯定不会坑他就是了。

扯远了。公司的java项目一直用ip地址+8080+项目目录的形式访问,php当然也可以,但为了平时方便使用,一般都会选择二级域名访问。解析二级域名,设置nginx虚拟主机,习惯如此。这当下,公司的域名备案突然没了,域名状态正常,但访问会提示备案。经过一番与备案客服的询问后得知,在新的政策下,公司之前的域名备案有问题,需要整改,但一直没有回应,就被备案系统强制注销掉了。阿里云多次发送邮件到公司的邮箱,但都石沉大海。想问客服,为什么不打电话的,看到邮箱里的整改邮件,里面有一条就是网站责任人手机号不正确。好吧,得注销原来的备案主体,然后重新备案。但眼下最要紧的事是,公司承接的一些项目怎么办?尤其是小程序只能用https域名形式,现在是彻底歇菜了。一些其他的项目,想着应该可以通过ip+项目名进行访问。

践行

本以为会简单,直接通过ip+项目名访问就是了,其实不然。所有的ci项目都做了url优化,访问项目,会有一个uri重写(跳转)的步骤。原来是设置虚拟主机,项目目录就是根目录。但现在的根目录是ip地址指向的document_root,所以需要对rewrite规则做一下修改。

之前的虚拟主机配置如下(nginx):

server
{
    listen 80;
    server_name test.xx.com;
    index index.html index.htm index.php;
    root  /home/wwwroot/test;

    location / {
        try_files $uri $uri /index.php$uri;
    }

    location ~ [^/]\.php(/|$)
    {
            fastcgi_pass  unix:/tmp/php-cgi.sock;
            fastcgi_index index.php;
            include fastcgi.conf;
            include pathinfo.conf;
    }

    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
    {
        expires      30d;
    }

    location ~ .*\.(js|css)?$
    {
        expires      12h;
    }
    access_log  /home/wwwlogs/test.log  access;
}

现在是通过ip访问所有的项目了,所以需要在ip对应的虚拟主机设置中,添加对相关项目访问的url重写。

server
{
    listen 80;
    server_name 121.43.60.204;
    index index.html index.htm index.php;
    root  /home/wwwroot;

    location /test/{
        try_files $uri $uri test/index.php$uri;
    }

    #location /test/ {
    #   if (!-e $request_filename) {
    #       rewrite  ^/(.*)$  /test/index.php/$1  last;
    #       break;
    #  }
    #}

    location ~ [^/]\.php(/|$)
    {
            fastcgi_pass  unix:/tmp/php-cgi.sock;
            #fastcgi_pass  127.0.0.1:9000;
            fastcgi_index index.php;
            #include fastcgi.conf;
            include pathinfo.conf;
            set $path_info "";
            set $real_script_name $fastcgi_script_name;
            if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$"){
                 set $real_script_name $1;
                 set $path_info $2;
            }
            include fastcgi.conf;
            fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;
            fastcgi_param SCRIPT_NAME $real_script_name;
            fastcgi_param PATH_INFO $path_info;
    }

    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
    {
        expires      30d;
    }

    location ~ .*\.(js|css)?$
    {
        expires      12h;
    }
    access_log  /home/wwwlogs/access.log  access;
}

fastcgi部分是为了解析php文件,不用修改,保持原样就好。主要是针对location /部分,添加了项目目录,location配置下面用#号注释部分,是nginx改写的另一种形式,适用于nginx低版本(<1.2)。

弯路

找问题是很少能够一步切中要害的,所以不免有些白折腾。之前的思路是,通过修改.htaccess文件,修改RewriteBase。但是部署到服务器上一直没起作用(nginx一般是不会去主动解析.htaccess文件的,一叶障目,没想到),就想着是不是base_url要设置一下ci 3.1.x新版本base_url配置 - 海滨擎蟹。之后又折腾了一下ci新版本,无果,便想着先在本地调试好了,然后再部署,然而本地根本没有问题,访问正常,但是到线上就一直404,是那种ci自己输出的404。所以一下次明白了,关键点还是在url重写上面。这时忽然意识到本地是apache,而服务器上是nginx。所以要在虚拟主机里面做修改调试。之后就ok了。

文章目录