如何为共享资源的多域名Laravel应用配置多公共路径?
嘿,这个场景我之前帮朋友处理过,其实你有几个可行的方向,既可以解决SSL的问题,也能满足你拆分public目录的需求,我一个个给你捋清楚:
其实你不用急着拆分public目录,先纠正一个误区:Web服务器(Nginx/Apache)是支持给同IP同端口配置多个SSL证书的,但更简单的方式是申请一张多域名SAN证书(或者通配符证书,如果你的域名是同后缀的话),一张证书就能覆盖你的三个域名。
步骤很简单:
- 向证书服务商申请SAN证书,把三个域名都加进去
- 在Web服务器配置里,给每个域名的
server块指定同一个证书文件就行 - 这样三个域名都能正常走HTTPS,而且完全不用改动Laravel的结构,你的中间件检测域名的逻辑也能继续用
如果你确实需要拆分public目录来做独立的静态资源管理,这个方案也可行:
创建独立的public子目录
在原/www/myProject/app/public/下创建三个子目录:site1、site2、site3,把原public目录里的index.php、.htaccess(Apache用)复制到每个子目录里。修改子目录的index.php路径
每个子目录的index.php需要调整路径指向Laravel的核心文件:
原代码:require __DIR__.'/../vendor/autoload.php'; $app = require_once __DIR__.'/../bootstrap/app.php';修改为:
require __DIR__.'/../../vendor/autoload.php'; $app = require_once __DIR__.'/../../bootstrap/app.php';配置Web服务器(以Nginx为例)
给每个域名配置独立的server块,指定对应的public子目录和SSL证书:server { listen 443 ssl; server_name site1.yourdomain.com; root /www/myProject/app/public/site1; ssl_certificate /path/to/site1-cert.pem; ssl_certificate_key /path/to/site1-key.pem; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { fastcgi_pass unix:/var/run/php/php8.2-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } # 复制上面的server块,修改site2、site3的域名、根目录和SSL证书路径优化静态资源管理
不想重复复制静态文件的话,可以用符号链接共享原public的资源:ln -s /www/myProject/app/public/css /www/myProject/app/public/site1/css ln -s /www/myProject/app/public/js /www/myProject/app/public/site1/js这样三个站点可以共用同一套静态资源,也能在各自子目录里添加独立资源。
如果不需要独立的静态资源目录,这个方案最省事——直接在Web服务器给每个域名配置独立的server块,都指向原public目录,但各自用不同的SSL证书:
server { listen 443 ssl; server_name site1.yourdomain.com; root /www/myProject/app/public; ssl_certificate /path/to/site1-cert.pem; ssl_certificate_key /path/to/site1-key.pem; location / { try_files $uri $uri/ /index.php?$query_string; } # PHP配置和上面一致 } server { listen 443 ssl; server_name site2.yourdomain.com; root /www/myProject/app/public; ssl_certificate /path/to/site2-cert.pem; ssl_certificate_key /path/to/site2-key.pem; # 其他配置同上 }
这样三个域名都指向同一个Laravel应用,你的中间件检测域名的逻辑完全不受影响,SSL也能各自独立配置,不用改任何Laravel代码。
内容的提问来源于stack exchange,提问作者Adam

