nginx 重写规则构建漂亮 URL 的最佳方法

nginx 重写规则构建漂亮 URL 的最佳方法

该网页的访问方式如下:

`example.com/` or `example.com/?site=website` 

在此示例中,我访问的是网站位于示例.com领域。

有人可以建议一种重写规则的最佳方法,以便显示和访问上述内容example.com/website,或者仅example.com/在未site发送任何内容时才显示和访问?

nginx,Centos 7

更新

尝试了以下操作:

location / {
    index index.php;
    rewrite ^/(website)$ /site?$1;
}

答案1

几周前几乎有一个相同的问题:

https://stackoverflow.com/questions/45257380/nginx-rewrite-query-string-args-to-html-url-wo-backend-support/45293264#45293264

https://gist.github.com/cnst/3521404dfdf5cb7b4c526b5c6dff38ff

location = / {
    if ($arg_site) {
        return  302 /$arg_site;
    }
    return  200
    "<!DOCTYPE html><title>site</title>
    <form><input name='site' value='website'/></form>\n";
}
location / {
    rewrite     ^/([^/]*)\$     /?site=$1   break;
    proxy_pass  http://localhost:7381;
}

这个想法是你创建一个重定向循环,但实际上并非如此,因为外部重定向和内部重定向之间存在差异,所以循环不是一个封闭的循环,因为一个重定向明确地只是外部的,而另一个重定向明确地只是内部的。

答案2

这应该可以工作。基本上,它会捕获斜线后、字符串结束前的字符串,并使用该字符串作为参数调用站点

location /
  rewrite ^/(website)$ /site?$1;
}

浏览器需要使用如下 URLhttp://example.com/abcd,Nginx 内部会调用http://example.com/site=abcd 。您显然需要设置一个位置来响应该 URL 上的请求。例如

location /site
  proxy_pass localhost:1234;
}

我使用普通的 Nginx 配置进行了测试,它与上面的配置唯一的不同之处在于测试所需的 .html 扩展名。

server {
  listen 80;
  server_name test1.example.com;

  location / {
    root /var/www/test1;
    rewrite ^/(website).html$ /site.html?$1;
  }    
}

我创建了两个文件,website.html 和 site.html,内容是它们的文件名。如果不重写,浏览器会显示“website”。如果重写,则显示“site”。这证明测试配置有效。

相关内容