【情景】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