Nginx 特定的重写

Nginx 特定的重写

我对 nginx 重写感到困惑。如果可以的话请帮助我。谢谢

配置文件

#vhost-xxxxx
server {

        listen       80;
        server_name  xxxx.xxxx.com;   
        root   /var/www/html;        
        index index.php index.html index.htm;
        charset utf-8;
       access_log  logs/xxxxxx.access.log;

}

#rewrite
 if (!-e $request_filename)
{

       rewrite ^(.+)$ /cn/index.php?q=$1 last;
}

location ~ \.php$ {

        root           /var/www/html;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME   $document_root$fastcgi_script_name;
        include        fastcgi_params;

}

}

大家好,我的 nginx 指向 /var/www/html 根文件夹,在 /var/www/html 下我有 3 个文件夹 cn、my、en

因此,如果我继续访问 xxxxx.xxxxx.com/cn/,那么上面的配置就不会有问题。

但是当我处理 xxxxx.xxxxx.com/en 或 /my 时,它显示 403 Forbidden。

在进行这些设置之前我确实尝试过

#rewrite
 if (!-e $request_filename)
{

       rewrite ^(.+)$ /cn/index.php?q=$1 last;
       rewrite ^(.+)$ /en/index.php?q=$1 last;
       rewrite ^(.+)$ /my/index.php?q=$1 last;
}

但只有 cn 才能发挥作用,其他的将被禁止。

我怎样才能做到如果我的用户去了/en它会重写为

rewrite ^(.+)$ /en/index.php?q=$1 last;

或者我的用户去了/my 将重写为

rewrite ^(.+)$ /my/index.php?q=$1 last;

我怎样才能使它具体化

ps://我的域名始终是一样的。

谢谢你,谢谢你的帮助

答案1

这三个重写规则具有相同的正则表达式,因此只有第一个会被执行。我建议您使用locationandtry_files指令,而不是ifand rewrite

server {
    listen       80;
    server_name  example.com;
    charset utf-8;
    access_log  logs/xxxxxx.access.log;

    root   /var/www/html;

    index index.php;
    location = / { return 301 /cn/; }

    location / {
        try_files $uri $uri/ /cn/index.php?q=$uri;
    }
    location /en {
        try_files $uri $uri/ /en/index.php?q=$uri;
    }
    location /my {
        try_files $uri $uri/ /my/index.php?q=$uri;
    }
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass   127.0.0.1:9000;
        include        fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME   $document_root$fastcgi_script_name;
    }
}

注意:我已删除并重新排序了 PHP 位置块中的某些指令。

如果您想将上述内容组合成正则表达式(可能效率较低但可扩展):

server {
    listen       80;
    server_name  example.com;
    charset utf-8;
    access_log  logs/xxxxxx.access.log;

    root   /var/www/html;

    index index.php;
    location = / { return 301 /cn/; }

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass   127.0.0.1:9000;
        include        fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME   $document_root$fastcgi_script_name;
    }
    location ~ "^(?<lang>/\w{2})/" {
        try_files $uri $uri/ $lang/index.php?q=$uri;
    }
}

nginx获得指令及其文档的列表。

编辑:index向两个示例、location =第一个示例以及两个示例中的$uri/每个示例添加了指令。添加到 PHP 位置以确保完整性。try_filestry_files

相关内容