仅适用于根域的 NGINX 位置子句

仅适用于根域的 NGINX 位置子句

我如何仅在点击时重定向到。sub1.example.com例如,如果我在,点击不会将我重定向回,而是重定向到实际页面?$request_filename ~ /sub1example.comsub1.example.com/sub1sub1.example.comsub1.example.com/sub1

我的NGINX配置:

server
{
    server_name .example.com;
    access_log /var/log/nginx/example.com.access.log;
    error_log /var/log/nginx/example.com.error.log;
    root /var/www/html/example;
    index index.php;

    location ~ \.php$ {
        if (-f $request_filename) {
            fastcgi_pass    127.0.0.1:9000;
        }
        fastcgi_index   index.php;
        fastcgi_param   SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include         fastcgi_params;
    }

    location / {
        if ($request_filename ~ /sub1) {
            rewrite ^ http://sub1.example.com/? permanent;
        }
        if ($request_filename ~ /sub2) {
            rewrite ^ http://sub2.example.com/? permanent;
        }
        if (!-f $request_filename) {
            rewrite ^(.*)$ /index.php last;
        }
    }
}

如何使用 location 仅适用于根域的子句?

更新@Marcel:

server
{
    server_name .example.com;
    access_log /var/log/nginx/example.com.access.log;
    error_log /var/log/nginx/example.com.error.log;
    root /var/www/html/example;
    index index.php;
    location ~ \.php$ {
        if (-f $request_filename) {
            fastcgi_pass    127.0.0.1:9000;
        }
        fastcgi_index   index.php;
        fastcgi_param   SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include         fastcgi_params;
    }

    location = /sub1 {
       if($host = "example.com") {
           rewrite ^ http://sub1.example.com permanent;
       }
    }
    location = /sub2 {
       if($host = "example.com") {
           rewrite ^ http://sub2.example.com permanent;
       }
    }
    location / {
       if (!-f $request_filename) {
           rewrite ^(.*)$ /index.php last;
       }
    }
}

答案1

不要在块If内使用Location。最好server {}在配置中使用不同的声明几个部分server_name

而是if (-f $request_filename) {使用try_files指令。

答案2

Nginx 以特定方式处理位置指令,具体取决于您拥有哪些指令。此链接指出 nginx 的行为:

位置既可以通过前缀字符串定义,也可以通过正则表达式
定义。正则表达式的指定方法是在前面加上“~*”修饰符(用于不区分大小写的匹配),或加上“~”修饰符(用于区分大小写的匹配)。

为了找到与给定请求匹配的位置,nginx 首先检查使用前缀字符串(前缀位置)定义的位置。从中搜索最具体的一个。
然后按照正则表达式在配置文件中的出现顺序检查正则表达式。正则表达式的搜索在第一次匹配时终止,并使用相应的配置。

如果未找到与正则表达式匹配的项,则使用最具体的前缀位置的配置。”

location /是与每个请求匹配的通配符位置。

你的位置应该是这样的:

location ~ \.php$ {
    if (-f $request_filename) {
        fastcgi_pass    127.0.0.1:9000;
    }
    fastcgi_index   index.php;
    fastcgi_param   SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include         fastcgi_params;
}
location = /sub1 {
   if($host = "example.com") {
       rewrite ^ http://sub1.example.com permanent;
   }
}
location = /sub2 {
   if($host = "example.com") {
       rewrite ^ http://sub2.example.com permanent;
   }
}
location / {
   if (!-f $request_filename) {
       rewrite ^(.*)$ /index.php last;
   }
}

相关内容