为了将整个网站镜像为静态 HTML,
我想将 URL 转换http://example.com/script.php?t=12
为http://example.com/script.php_t=12
。
注意?
URL 正在被转换为_
。
这将允许 nginx 或 apache 将这些文件从磁盘作为我们获取并保存的原始 HTML(wget
每个 URL 一个文件)而不是 PHP 文件来提供。
是否可以通过 Nginx URL 重写来实现?
答案1
我使用try_files完成了这项工作:
location / {
try_files "${uri}_${args}" 404.html;
}
这将尝试在磁盘上查找一个以您提供的模式命名的文件,该文件以“_”而不是“?”命名。
进一步的配置取决于您如何保存静态文件(如图像或样式表)。您可以添加一个后备选项,尝试在不使用磁盘查询字符串的情况下读取它们,如下所示:
location / {
try_files "${uri}_${args}" $uri 404.html;
}
答案2
大致如下:
location ~ \.php$ {
# only rewrite URL's with args
if ($args != '') {
rewrite .* "${uri}_${args}?" last;
}
}
答案3
我不认为你能用 vanilla nginx 做到这一点,但如果你愿意为 nginx 安装 Lua 模块(http://wiki.nginx.org/HttpLuaModule) 你能行的。
server {
server_name so.dev;
listen 80;
location / {
root /tmp;
rewrite_by_lua '
local uri = ngx.var.uri
local params = ngx.req.get_uri_args(0)
for key, value in pairs(params) do
uri = string.format("%s_%s=%s", uri, key, value)
end
ngx.req.set_uri(uri)
ngx.req.set_uri_args({})
';
}
}
在本地测试了一下,似乎可以满足您的要求。如果您想让其他参数用 & 符号分隔,请将 rewrite_by_lua 块更改为
local uri = ngx.var.uri
local param_string = ""
local params = ngx.req.get_uri_args(0)
local separator = ""
for key, value in pairs(params) do
param_string = param_string .. separator .. key .. "=" .. value
separator = "&"
end
ngx.req.set_uri(uri .. "_" .. param_string)
ngx.req.set_uri_args({})