相信在升级完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,自己研究一下就可以了。