nginx 从所有 URL(少数例外)重定向到末尾带有斜杠的 URL

nginx 从所有 URL(少数例外)重定向到末尾带有斜杠的 URL

我需要将所有 URL(除了几个例外)重定向到末尾带有斜线的 URL。例如https://example.org/some-url=>https://example.org/some-url/

但我想阻止重定向,如果是这样的:

  • 文件
  • 目录
  • 其中一个异常 URL
  • 通配符 URL 之一,返回来自“ style.css”、“ style.123.css”、“ style.34553.css”的文件

我使用以下配置重定向到末尾带有斜杠的 URL:

set $my_var 0;
if (-f $request_filename) {
  set $my_var 1;
}
if (-d $request_filename) {
  set $my_var 1;
}
if ($request_uri ~ "^.*/market/cart$") {
  set $my_var 1;
}
if ($request_uri ~ "^.*/market/order/accept$") {
  set $my_var 1;
}
if ($request_uri ~ "^.*/market/order/status$") {
  set $my_var 1;
}
if ($my_var = 0) {
  rewrite ^(.*[^/])$ $1/ permanent;
}

为了创建通配符重定向,我使用了

location ~* (.+)\.(?:\d+)\.(js|css|png|jpg|jpeg|gif)$ {
  try_files $uri $1.$2;
}

但是如何使用这个通配符重定向到末尾的斜线location?也许这是使此配置更正确和清晰的方法。

答案1

我自己还没有测试过,所以可能不行。不过你可以试试这个:

location / {
    try_files $uri @addslash =404;
}

location @addslash {
    rewrite ^(.+[^/])$ $1/ permanent;
}

location ~ /market/cart$ {
    ... your try_files statement from configuration
}

location ~ /market/order/(?:accept|status)$ {
    ... your try_files statement from configuration
}

location ~* (.+)\.(?:\d+)\.(js|css|png|jpg|jpeg|gif)$ {
    try_files $uri $1.$2;
}

我们使用@addslash位置块将斜杠添加到 URL。

然后,我们location对要处理的 URL 使用单独的块,而无需在末尾添加斜杠。我简化并合并了正则表达式模式。在这里,您需要复制 CMS 前端控制器模式try_files语句,以便将请求正确传递给您的 CMS。

最后我们得到了用于匹配图像的正则表达式。

由于 nginx 处理location块的顺序,这应该会给你你所寻找的行为。

答案2

我找到了可行的解决方案。它使用了不好的做法(if is evil),但它只是可行的代码。因此,如果有人能提供更好的工作决策,我将不胜感激。

set $my_var 0;
if (-f $request_filename) {
  set $my_var 1;
}
if (-d $request_filename) {
  set $my_var 1;
}
if (-d $request_filename) {
  set $my_var 1;
}
if ($request_uri ~ "^.*/market/cart$") {
  set $my_var 1;
}
if ($request_uri ~ "^.*/market/order/accept$") {
  set $my_var 1;
}
if ($request_uri ~ "^.*/market/order/status$") {
  set $my_var 1;
}
if ($request_uri ~* "(.+)\.(?:\d+)\.(js|css|png|jpg|jpeg|gif)$") {
  set $my_var 1;
}

if ($my_var = 0) {
  rewrite ^(.*[^/])$ $1/ permanent;
}

if ($request_uri ~* "^(.*/)index\.php$") {
  return 301 $1;
}


location ~* (.+)\.(?:\d+)\.(js|css|png|jpg|jpeg|gif)$ {
  try_files $uri $1.$2;
}

location / {
  try_files $uri $uri/ /index.php$is_args$args;
}

location ~ \.php$ {
  include snippets/fastcgi-php.conf;
  fastcgi_pass unix:/run/php/php7.0-newstom-fpm.sock;
  fastcgi_read_timeout 300;
}

相关内容