我花了很多时间来实现这个(希望是简单的)解决方案。
我们在 site.com 有一个站点,它由 /home/site/public 提供服务。我们需要一个 site.com 的特定子目录 (site.com/gps),以便从不同的文档根目录提供服务,以避免安全隐患。例如,site.com/gps 应由 /home/sitegps/public 提供服务。我已经实现了以下位置块,但由于无限重定向,它只会导致 http 500。我希望有人以前做过这件事,知道我哪里做错了……
# Send all /gps requests to new root
location ~ ^/gps(?:/(.*))?$ {
alias /home/sitegps/public;
try_files $uri $uri/ /gps/index.php?$uri&$args;
}
答案1
而不是alias
,可以使用根位置块内的指令。
/gps
我认为您也可以通过使用来简化您的位置匹配。
location /gps {
root /home/sitegps/public;
try_files $uri $uri/ /gps/index.php?$uri&$args;
}
这不会重写请求,并且会匹配名为gps
这样的目录中的文件:/home/sitegps/public/gps/
。我不确定这是否是必需的。
更新
假设您不想gps
在/home/sitespg/public
目录中拥有该目录,我测试了使用别名并得出以下配置:
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.html;
server_name _;
location / {
try_files $uri $uri/ =404;
}
location /gps/ {
alias /var/www/gps;
try_files $uri $uri/ =404;
}
}
我相信它们alias
会做你想做的事,但是要么是正则表达式位置匹配导致了问题,要么是存在其他问题。
使用尾随斜杠,/gps/
您将避免匹配类似的路径/gpsport
,但您需要重写/gps
或/gps/
与/gps
位置块完全匹配。
改写:
rewrite ^/gps$ /gps/
地点:
location = /gps {
alias /var/www/gps;
try_files $uri $uri/ =404;
}
毫无疑问,还有更多的变化也可以发挥作用。