Nginx 重写规则将查询字符串问号替换为下划线

Nginx 重写规则将查询字符串问号替换为下划线

为了将整个网站镜像为静态 HTML,

我想将 URL 转换http://example.com/script.php?t=12http://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({})

答案4

维基百科

如果在重写末尾指定?那么 Nginx 将删除原始的 $args(参数)。

那么就rewrite ^ ${uri}_$args? last;应该可以了。

相关内容