Nginx重写:添加尾部斜杠,保留锚点和查询字符串

时间:2017-09-26 08:05:47

标签: regex nginx url-rewriting

我需要确保给定网站上的所有永久链接都以尾部斜杠结尾。也就是说,任何引用不与实际单个文件相对应的位置的URL。我还需要保留使用URL传递的任何查询字符串和/或锚点。

实施例

说我在以下位置有一个页面:

example.com/about/

如果我收到以下请求,我希望它们如下所示重写:

  • example.com/about> example.com/about/
  • example.com/about?src=fb> example.com/about/?src=fb
  • example.com/about#contact> example.com/about/#contact
  • example.com/about#contact?src=fb> example.com/about/#contact?src=fb

但是,我想确保重写任何实际的文件路径 - 任何具有文件扩展名的内容。

到目前为止我有什么

这是我到目前为止提出的正则表达式,它只解决了排除真实文件路径的问题,并在字符串末尾没有一个时添加了一个尾部斜杠:

^([^\.]*$(?<!\/))

我还没有弄清楚如何确定当存在锚点或查询字符串时是否存在尾部斜杠,并且一旦确定如何分别捕获应该在尾部斜杠之前应该存在的部分然后在它之后组装最后的重写。

1 个答案:

答案 0 :(得分:1)

事实证明,我提出的正则表达式实际上解决了我所有的重写需求。以下是我的Nginx server配置中的最终结果:

location / { 
    try_files $uri $uri/ @rewrites;
}   

# Rewrite rules to sanitize and canonicalize URLs
location @rewrites {
    rewrite ^([^\.]*$(?<!\/)) $1/ last;
}