我需要将所有 URL(除了几个例外)重定向到末尾带有斜线的 URL。例如https://example.org/some-url
=>https://example.org/some-url/
但我想阻止重定向,如果是这样的:
- 文件
- 目录
- 其中一个异常 URL
- 通配符 URL 之一,返回来自“
style.css
”、“style.123.css
”、“style.34553.css
”的文件
我使用以下配置重定向到末尾带有斜杠的 URL:
set $my_var 0;
if (-f $request_filename) {
set $my_var 1;
}
if (-d $request_filename) {
set $my_var 1;
}
if ($request_uri ~ "^.*/market/cart$") {
set $my_var 1;
}
if ($request_uri ~ "^.*/market/order/accept$") {
set $my_var 1;
}
if ($request_uri ~ "^.*/market/order/status$") {
set $my_var 1;
}
if ($my_var = 0) {
rewrite ^(.*[^/])$ $1/ permanent;
}
为了创建通配符重定向,我使用了
location ~* (.+)\.(?:\d+)\.(js|css|png|jpg|jpeg|gif)$ {
try_files $uri $1.$2;
}
但是如何使用这个通配符重定向到末尾的斜线location
?也许这是使此配置更正确和清晰的方法。
答案1
我自己还没有测试过,所以可能不行。不过你可以试试这个:
location / {
try_files $uri @addslash =404;
}
location @addslash {
rewrite ^(.+[^/])$ $1/ permanent;
}
location ~ /market/cart$ {
... your try_files statement from configuration
}
location ~ /market/order/(?:accept|status)$ {
... your try_files statement from configuration
}
location ~* (.+)\.(?:\d+)\.(js|css|png|jpg|jpeg|gif)$ {
try_files $uri $1.$2;
}
我们使用@addslash
位置块将斜杠添加到 URL。
然后,我们location
对要处理的 URL 使用单独的块,而无需在末尾添加斜杠。我简化并合并了正则表达式模式。在这里,您需要复制 CMS 前端控制器模式try_files
语句,以便将请求正确传递给您的 CMS。
最后我们得到了用于匹配图像的正则表达式。
由于 nginx 处理location
块的顺序,这应该会给你你所寻找的行为。
答案2
我找到了可行的解决方案。它使用了不好的做法(if is evil),但它只是可行的代码。因此,如果有人能提供更好的工作决策,我将不胜感激。
set $my_var 0;
if (-f $request_filename) {
set $my_var 1;
}
if (-d $request_filename) {
set $my_var 1;
}
if (-d $request_filename) {
set $my_var 1;
}
if ($request_uri ~ "^.*/market/cart$") {
set $my_var 1;
}
if ($request_uri ~ "^.*/market/order/accept$") {
set $my_var 1;
}
if ($request_uri ~ "^.*/market/order/status$") {
set $my_var 1;
}
if ($request_uri ~* "(.+)\.(?:\d+)\.(js|css|png|jpg|jpeg|gif)$") {
set $my_var 1;
}
if ($my_var = 0) {
rewrite ^(.*[^/])$ $1/ permanent;
}
if ($request_uri ~* "^(.*/)index\.php$") {
return 301 $1;
}
location ~* (.+)\.(?:\d+)\.(js|css|png|jpg|jpeg|gif)$ {
try_files $uri $1.$2;
}
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.0-newstom-fpm.sock;
fastcgi_read_timeout 300;
}