从子目录请求文件时如何重写语言 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.svg
或 GET /en/gb.svg
当我想要但找不到如何做的结果是从 / 请求它,如 GET /sp.svg
和 GET /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;
}
我正在使用 Nginx 配置我的第一个网页,目前我正开始尝试使用两种可用语言的网络。
我的主要问题是,当我输入 example.com/es/Inicio 或 example.com/en/Index 时,模板中要求的文件(例如图像)是 404,服务器接收 uri作为 GET /es/sp.svg
或 GET /en/gb.svg
当我想要但找不到如何做的结果是从 / 请求它,如 GET /sp.svg
和 GET /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;
}