关于使用一个域名绑定两个站点:hustoj和LDUOnlineJudge

【情景】php

ACM实验室有这样的需求:当前只有一个域名(icpc.ldu.edu.cn),但但愿保留hustoj的同时,部署新系统LDUOnlineJudge,要求效果是icpc.ldu.edu.cn/oj1访问hustoj,icpc.ldu.edu.cn/oj2访问新系统LDUOnlinejudgenginx

【状况分析】web

注意到,hustoj项目的全部href都是相对路径,这样在nginx直接使用虚拟路径映射过来就行。但LDUOnlineJudge中,全部的href均为完整url,修改整个项目的href不太现实,故能够在provider中为项目路由添加一个前缀/oj2,以达到上文的目的。bash

具体方法以下文。app

【解决方案】ide

共需修改3个nginx配置文件。函数

1. 修改hustoj的nginx配置文件 /etc/nginx/sites-enabled/default ,将listen监听的端口80改成其余(如8060)this

2. 修改LDUOnlineJudge的nginx配置文件 /etc/nginx/conf.d/lduoj.conf ,将listen监听端口80改成其余(如8080)url

3. 新建配置文件 /etc/nginx/conf.d/oj.conf,内容以下spa

server {
        listen 80;
        server_name _;

        location ^~ /oj1/ {
            proxy_pass http://127.0.0.1:8060/;
            proxy_redirect  off;
            proxy_set_header  Host  $host;
            proxy_set_header  X-Real-IP  $remote_addr;
            proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
        }

        location / {
            proxy_pass http://127.0.0.1:8080/;
            proxy_redirect  off;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
}

4. 修改文件/home/LDUOnlineJudge/app/Providers/RouteServiceProvider.php,找到mapWebRoutes函数,增长->prefix('oj2')

protected function mapWebRoutes()
    {
        Route::middleware('web')
             ->prefix('oj2')
             ->namespace($this->namespace)
             ->group(base_path('routes/web.php'));
    }

【结果】

上文的目的达到。可是这样有一个弊端,单独域名icpc.ldu.edu.cn就不能使用了,应为它指向了lduoj,但lduoj又没有对应的路由。

 

不妨这样,解决方案能够只完成前3步,就能够实现同一个域名访问两个oj,即icpc.ldu.edu.cn/oj1访问hustoj,icpc.ldu.edu.cn访问LDUOnlineJudge