Caddy2的伪静态该怎么搞?

相信在升级完caddy2之后,已经有很多人被新配置搞得异常烦躁,现在又要考虑伪静态的问题了。实际上,如果你的规则很简单,就是把所有的路由交给 index.php 处理的话,其实只需要写这样的规则:

rewrite * /index.php

不过,这样写明显会影响到静态文件的获取,所以我们应该这样写(跟上面的效果不太一样,但是就这个意思):

try_files {path} {path}/ /index.php?{query}&p={path}

这个try_files,就是先考虑了静态文件,然后再将其他请求导向 index.php。其实跟nginx的规则是很像的,但是我相信应该比较少人手打nginx重写规则吧,apache的会多些。

这是最简单的情况,但我还有更加复杂的规则,怎么办?此时要分几种情况:

1. 静态文件全部在一个文件夹内,我要把其他请求重写

首先要明确,你的重写规则要足够复杂,才看到这里,比如我要把 /foo/bar 重写为 index.php?m=foo&a=bar,这种才算是比较复杂的。以它为例,我们要这样写:

handle /static/* {
  file_server
}

@rewrite {
  path_regexp ma (.+?)/(.+?)$
}

handle {
  rewrite @rewrite index.php?m={http.regexp.ma.1}&a={http.regexp.ma.2}&{query}
}

这只是个示例,请根据实际情况进行修改。

首先解释一下handle,它是一个处理器,捕捉指定前缀的请求,并作出相应的响应。例如我想要 /static/* 的请求全部作为文件服务器来访问,即静态文件,则应用 file_server;handle {}则表示除指定前缀外的所有请求都由它处理,这里就是把重写放到了默认handle。

@rewrite是个名称匹配器,这里是将 path_regexp 包装起来,然后给rewrite进行调用。path_regexp就是用一个正则来匹配参数,这个应该不陌生吧。ma的位置就是参数名,在rewrite可以调用,即{http.regexp.ma.1}这种形式,后面的数字是参数的位置。记得后面还得加上{query},不然URL中的参数就会被覆盖掉,程序接收不到。

2. 我只重写某一个路径,其他按静态文件处理

与上面的思路是相反的:

handle /api/* {
  rewrite * /index.php?{query}&p={path}
}

handle {
  file_server
}

假若你的规则足够简单,也可以写为

rewrite /api/* /index.php?{query}&p={path}

然后需要在下面加上 file_server,不然获取不了静态文件。

 

还有很多复杂的情况,需要自己去搭配,但是套路无非就是 handle try_files rewrite,自己研究一下就可以了。

发表评论