如何在Caddy中为单个文件配置别名(Alias)?
问题描述
需要将普通文件夹作为网站根目录提供服务,同时让子目录下的特定单个文件从另一路径获取,其他文件仍从根目录子目录获取。当前Caddy配置无法实现该需求:
localhost { header { Cache-Control "no-cache, no-store, must-revalidate" } tls C:\localhost\keys\localhost.crt C:\localhost\keys\localhost.key log { output file C:\localhost\logs\access.log format console } handle_path /js/main.js { # 此处配置无效 root "C:\someOtherFolder\main.js" } handle { # 处理根目录www文件夹 file_server browse root * "C:\localhost\www" } }
需求是让https://localhost/js/main.js对应本地文件C:\someOtherFolder\main.js,而/js/下其他文件仍从C:\localhost\www\js获取。在Apache中可通过一行Alias指令实现:
Alias /js/main.js C:/someOtherFolder/main.js
请问Caddy中该如何实现?
解决方案
问题出在你错误地将root指向了单个文件——Caddy的root指令仅用于设置目录路径,而非单个文件。要实现类似Apache Alias的单文件映射,有两种简洁的方式:
方法一:使用handle块优先匹配指定路径
利用Caddy的匹配优先级,用handle块单独处理/js/main.js请求,通过重写路径并设置正确的根目录来定位目标文件:
localhost { header { Cache-Control "no-cache, no-store, must-revalidate" } tls C:\localhost\keys\localhost.crt C:\localhost\keys\localhost.key log { output file C:\localhost\logs\access.log format console } # 专门处理/js/main.js请求 handle /js/main.js { # 将请求路径重写为文件名,配合root指向文件所在目录 rewrite * /main.js root * C:\someOtherFolder file_server } # 处理所有其他请求,使用默认根目录 handle { root * C:\localhost\www file_server browse } }
方法二:使用handle_path简化路径处理
handle_path会自动移除匹配的路径前缀,因此只需设置根目录为目标文件所在文件夹,直接提供文件即可:
localhost { header { Cache-Control "no-cache, no-store, must-revalidate" } tls C:\localhost\keys\localhost.crt C:\localhost\keys\localhost.key log { output file C:\localhost\logs\access.log format console } # handle_path会去掉匹配的/js/main.js前缀,请求变为空路径 # 此时设置root为文件所在目录,并重写为空路径到main.js handle_path /js/main.js { rewrite * /main.js root * C:\someOtherFolder file_server } handle { root * C:\localhost\www file_server browse } }
两种方法都能实现需求:优先匹配/js/main.js请求,从指定路径获取文件,其余请求则从默认根目录提供服务。
内容的提问来源于stack exchange,提问作者Volker
相关产品推荐
相关产品推荐

