从子目录请求文件时如何重写语言 uri。 Nginx Docker

How to rewrite language uri when asking for files from a subdirectory. Nginx Docker

我正在使用 Nginx 配置我的第一个网页,目前我正开始尝试使用两种可用语言的网络。

我的主要问题是,当我输入 example.com/es/Inicio 或 example.com/en/Index 时,模板中要求的文件(例如图像)是 404,服务器接收 uri作为 GET /es/sp.svgGET /en/gb.svg 当我想要但找不到如何做的结果是从 / 请求它,如 GET /sp.svgGET /gb.svg.

这是我的服务器的配置。

server {
    listen       81;
    listen  [::]:81;
    server_name  exampleIP;

    charset UTF-8;

    include /etc/nginx/mime.types;

    error_log /var/log/nginx/error_log warn;
    access_log /var/log/nginx/access_log main;

    rewrite ^(/.*)\.html(\?.*)?$  permanent;
    rewrite ^/(.*)/$ / permanent;

    root /usr/share/nginx/nginxTestPHP/PHP;

    index Inicio.php Index.php;

    location / {
        try_files $uri/index.html $uri.html $uri/ @extensionless-php;
    }

    location @extensionless-php {
        rewrite ^(.*)$ .php last;
    }

    #**This is just a poor try of my own rewrite.**
    #location @remove-es {
            #rewrite ^/es(.*)$  last;
            #rewrite ^/es/(.*)$ / permanent;
    #}

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_intercept_errors on;
        fastcgi_pass app:9000;
        fastcgi_index Inicio.php;
        fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
        include fastcgi_params;
    }

    location ^~ /es/ {
                try_files $uri/.php $uri.php $uri/ =404;
                fastcgi_intercept_errors on;
                fastcgi_pass app:9000;
                fastcgi_index Inicio.php;
                fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
                include fastcgi_params; 
    }

    location ^~ /en/ {
                try_files $uri/.php $uri.php $uri/ =404;
                fastcgi_intercept_errors on;
                fastcgi_pass app:9000;
                fastcgi_index Index.php;
                fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
                include fastcgi_params;
    }

    location ~ \.css {
        root /usr/share/nginx/nginxTestPHP/CSS;
        default_type text/css;
        add_header  Content-Type    text/css;
    }

    #**This is where I want the server to look at when handling this type of files**
    location ~ \.(png|jpg|svg|ico) {
    root /usr/share/nginx/nginxTestPHP/media;
        try_files $uri $uri/ /$uri @remove-es;
    }

}

在根目录下请求媒体文件没有问题,但是当请求来自 /es/ 或 /en/ 等子目录时,问题就来了,我不知道如何重写,因为我开始使用 nginx几周前和几天前尝试实现子目录。

顺便说一句,我仍然对 Nginx 的一些东西一无所知,所以如果你想在我的配置中指出另一个感觉对人类构成威胁的东西,请随意这样做。

您可能正在使用相对路径的 URI(以 ./ 开头或只是缺少前导 /),因此浏览器正在添加 /en//es/ 前缀,然后再将其发送到服务器。首选解决方案是在网页中修复它。在您要求像 src="./image.png" 这样的图像的地方,请改用 src="/image.png"


不过,修复Nginx将/es/image.png/en/image.png映射到同一个文件相对简单。

所有以 /es//en/ 开头的 URI 都由它们各自的 location 块处理。修改 try_files 语句以通过删除语言前缀重写图像 URI。

例如:

location ^~ /es/ {
    try_files $uri/.php $uri.php $uri/ @rewrite;
    ...
}

location ^~ /en/ {
    try_files $uri/.php $uri.php $uri/ @rewrite;
    ...
}

location @rewrite {
    rewrite ^/(es|en)(/.*\.(png|jpg|svg|ico))$  last;
    return 404;
}