在 nginx 中排除重写执行的文件夹

在 nginx 中排除重写执行的文件夹

我遇到过这种情况,我有 domain.com 以及 m.domain.com 的单独代码。因此,我检查用户是否来自移动设备,重写为 m.domain.com,否则访问常规 domain.com,但我有一个文件夹 domain.com/blog,即使用户来自移动设备,也不应该重定向到 m.domain.com。我尝试了“嵌套 if”的所有可能性,但遗漏了一些东西。以下是我尝试过的方法。任何帮助都非常感谢

我的 nginx.conf

server {
listen   80;
server_name domain.com;
rewrite ^(.*) http://www.domain.com$1 permanent;
}
server {
    listen       80;
    server_name www.domain.com;
    set $mobile_rewrite do_not_perform;

if ($request_uri !~ "^/blog/\w+$")
{
   set $mobile_rewrite do_not_perform;
}        

if ($http_user_agent ~* "(android|bb\d+|meego).+mobile||iemobile|ip(hone|od)||up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino") {
set $mobile_rewrite perform;
}


if ($mobile_rewrite = perform) {
    rewrite ^ http://m.domain.com$request_uri? redirect;
    break;
}


    root     /var/www/public_html/;
    index  index.php;

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

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

/* and there m.domain.com configuration lines also */

使用以下配置:当用户从移动设备登录时,它会重定向到 m.domain.com,但如果用户尝试从移动设备访问 domain.com/blog,那么它会重定向到 m.domain.com/blog,但它应该重定向到 m.domain.com/blog,而应该在 domain.com/blog

答案1

我会尝试这样的事情:

server {
    listen       80;
    server_name www.domain.com;

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

    location / {
        if ($http_user_agent ~* "(android|bb\d+|meego).+mobile||iemobile|ip(hone|od)||up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino") {
            rewrite ^ http://m.domain.com$request_uri? redirect;
        }
        try_files $uri $uri/ /index.php?$args;
    }
    root     /var/www/public_html/;
    index  index.php;
}

这里/blog首先测试位置,如果匹配,nginx 就直接为博客提供服务。

否则,nginx 将使用该/位置,我们在其中测试移动用户代理,如果用户代理包含所需的字符串,则执行重定向。

答案2

我认为您需要在配置中添加位置,而不是仅在服务器中使用一个位置。这可能不太有效,可能需要优化,但应该会为您指明正确的方向。

server {
  listen       80;
  server_name www.domain.com;

  set $mobile_rewrite do_not_perform;
  if ($request_uri !~ "^/blog/\w+$") {
    set $mobile_rewrite do_not_perform;
  }        

  if ($http_user_agent ~* " android|bb\d+|meego).+mobile||iemobile|ip(hone|od)||up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino") {
    set $mobile_rewrite perform;
  }

  location /blog {
    root     /var/www/public_html/;
    index  index.php;
  }

  location / {
    if ($mobile_rewrite = perform) {
      return 302 http://m.domain.com$request_uri?;
      break;
    }

    root     /var/www/public_html/;
    index  index.php;
  }

相关内容