使用查询参数值进行 NGINX 301 重定向

2024-05-21

我想重定向example.com/?lang=en to example.com/en/.

我正在使用 Python Django,我的服务器运行 Plesk / Nginx。

我尝试像这样在我的网页上重定向。但这是行不通的;

rewrite ^/?lang=en$ /en/ redirect;

但如果我删除问号重写就可以了。

我尝试了很多方法但找不到解决方案。

谢谢。


最简单的是

if ($arg_lang = en) {
    return 301 /en$uri;
}

但是,如果您有任何其他查询参数,它们将因此重定向规则而丢失。要保留所有其他查询参数,您可以执行以下操作:

if ($args ~ (.*)(^|&)lang=en(\2|$)&?(.*)) {
    set $args $1$3$4;
    return 301 /en$uri$is_args$args;
}

为了支持多种语言,我想到的第一个解决方案是

if ($args ~ (.*)(^|&)lang=([^&]*)(\2|$)&?(.*)) {
    set $args $1$4$5;
    return 301 /$3$uri$is_args$args;
}

但是如果你有一些畸形的lang查询参数值将导致重定向到不存在的页面。过滤lang仅支持语言的值您可以使用map http://nginx.org/en/docs/http/ngx_http_map_module.html#map指示:

map $arg_lang $prefix {
    en    /en;
    de    /de;
    ...
    # if none matched, value of $prefix variable would be an empty string
}
map $args $stripped_args {
    # remove "lang" query argument if exists
    ~(.*)(^|&)lang=[^&]*(\2|$)&?(.*)  $1$3$4;
    default                           $args;
}
server {
    ...
    if ($prefix) {
        set $args $stripped_args;
        return 301 $prefix$uri$is_args$args;
    }
    ...
}

如果您的 URI 语言前缀与lang查询参数值(或者可以通过一些正则表达式从中派生),第一个map块可以简化:

map $arg_lang $prefix {
    ~^(en|de|...)$    /$1;
}

Update

正如OP所说,当我们收到这样的请求时,可能会有一个警告example.com/de/some/path/?lang=en这将被重定向到不存在的页面example.com/en/de/some/path/。为了避免这种情况,我们可以定义额外的map阻止并从 URI 中去除语言前缀:

map $arg_lang $prefix {
    ~^(en|de|...)$    /$1;
}
map $args $stripped_args {
    # remove "lang" query argument if exists
    ~(.*)(^|&)lang=[^&]*(\2|$)&?(.*)  $1$3$4;
    default                           $args;
}
map $uri $stripped_uri {
    # remove language prefix from URI if one exists
    ~^/(en|de|...)(/.*)$  $2;
    default               $uri;
}
server {
    ...
    if ($prefix) {
        set $args $stripped_args;
        return 301 $prefix$stripped_uri$is_args$args;
    }
    ...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用查询参数值进行 NGINX 301 重定向 的相关文章

  • 使用 [P] 代理标志重写 .htaccess

    我正在尝试通过 htaccess 和代理标志进行不可见 透明 重写 它适用于 R 标志 但不适用于 P 标志 因为它只会给出 500 错误 这两个域位于不同的服务器上 并且启用了 mod proxy 模块 我的 htaccess 正确吗 O
  • 从 git repo 拉取后出现白屏死机(React JS、Nginx)

    每当我从 master 分支执行 git pull 到服务器上时 我所有的 React 文件似乎都消失了 屏幕变成白色 我发现的临时解决方法是 删除浏览器 cookie 缓存和站点历史记录 然后关闭浏览器并重试 删除node modules
  • 安装失败:无法在 ubuntu 上的 WordPress nginx 中创建目录

    我在本教程的帮助下设置了 WordPress 如何在 ubuntu 18 04 上使用 LEMP 安装 WordPress https www digitalocean com community tutorials how to inst
  • Rails/Passenger/Node.js:ExecJS“找不到 JavaScript 运行时”

    我正在尝试使用 Node js 作为我的 Rails 应用程序的 JavaScript 运行时 我在 Ubuntu 12 0 4 上使用 Phusion Passenger 模块和 Nginx 作为我的 Web 服务器 每次我访问 Rail
  • 在子目录中设置 WordPress 时出现错误的 wp-admin 重定向

    我在 docker 容器中设置了 wordpress 使用 nginx 反向代理转发所有位置请求 blog到那个 docker 容器 问题是登录 wp admin 后 它重定向到domain wp admin 代替 domain blog
  • Nginx Node.js 快速下载大文件止于 1.08GB

    我有这个由 Nginx 代理的 Node js 应用程序 在生产环境中 路线是这样的 exports download function req res var id req params id if id id latest res do
  • nginx/uwsgi 服务器的持久内存中 Python 对象

    我怀疑这是否可能 但这是问题和提出的解决方案 提出的解决方案的可行性是这个问题的对象 我有一些需要可用于所有请求的 全局数据 我将这些数据保存到 Riak 并使用 Redis 作为缓存层以提高访问速度 目前 数据被分为约 30 个逻辑块 每
  • 如何重写 URL 而不刷新,例如 GitHub.com

    我在浏览 GitHub com 时注意到 在查看存储库的源代码时 您单击一个文件 源代码会滑入 并且 URL 会发生变化 但页面看起来并没有刷新 有谁知道这是如何做到的 我见过使用 符号完成此操作 尤其是在创建 Flash 站点时 但我从未
  • Nginx 与 phpmyadmin 登录后重定向错误

    我正在使用 nginx 设置 phpMyAdmin 我可以访问 phpMyAdminhttp localhost phpmyadmin http localhost phpmyadmin 但是 当我登录时 URL 被重定向到http loc
  • nginx 的“ssl”指令已弃用,请使用“listen ... ssl”

    NGINX 升级后v1 15 2开始收到警告 nginx warn the ssl directive is deprecated use the listen ssl directive instead in usr local etc
  • 部署解耦的前端+后端应用程序

    我使用两个完全解耦的组件编写了一个网络应用程序 一个基于 Place Framework 并服务以下请求的 API 类型 api 任何客户 基于解耦的前端AngularJS建造使用grunt build 现在 前端与API但我希望这两个单元
  • Amazon Linux 上的 Nginx + php-fpm = 在信号 11 上退出

    亚马逊 Linux 最新 PHP 5 4 19 cli 构建时间 2013 年 9 月 3 日 23 19 23 nginx版本 nginx 1 2 9 安装 PHP FPM PHP 5 4 19 fpm fcgi 构建时间 2013 年
  • 使用 nginx 将 PATCH 请求代理为 POST

    我尝试使用 nginx 将 HTTP PATCH 请求重定向到 HTTP POST 请求 我还尝试了以下配置 但它不起作用 我收到 400 错误请求 http map request method my method default req
  • nginx 代理重定向,带有来自 uri 的端口

    我正在尝试使用 nginx 进行重定向 这个想法是将某些端口的 uri id 1234 重定向到 localhost 1234 固定端口的重定向 location id 1234 rewrite id 1234 1 break proxy
  • GitLab 发布临时 IP 禁令 - 403 禁止

    我的 GitLab 实例设置有时会对我们自己的 IP 地址实施 IP 禁令 导致办公室中的所有用户在任何网页或 git 请求上都会收到 403 Forbidden 该禁令的实施是由于身份验证重复出现错误 这完全是一个单独的问题 但我想防止我
  • nginx设置问题

    我知道这不是一个直接的编程问题 但是 stackoverflow 上的人似乎能够回答任何问题 我有一台运行 Centos 5 2 64 位的服务器 非常强大的双核 2 服务器 具有 4GB 内存 它主要提供静态文件 Flash 和图片 当我
  • 通过 ESI:include 设置 Cookie,如何?

    我正在尝试使用 esi 在我的网站上创建忍者缓存 这个想法是 该网站大部分是静态的 我只需要在用户是否登录时做一些花哨的事情 所以我试图在页面A上放置一个 并在页面B的应用程序中设置触发器 这样我就可以将页面 A 缓存在 varnish 上
  • Kubernetes - 一个 Ingress 中的多个配置

    我在同一个 Kubernetes 集群中运行不同的应用程序 我希望多个域能够访问我的 Kubernetes 集群 并根据域进行重定向 对于每个域 我想要不同的注释 配置 如果没有注释 我的入口部署如下 apiVersion networki
  • 无法从外部访问在 docker swarm 上运行的容器

    我正在 docker swarm 上运行我的容器 资产前端service 是我的前端应用程序 它在容器内运行 Nginx 并公开端口 80 现在如果我这样做 curl http 10 255 8 21 80 http 10 255 8 21
  • mod_rewrite 将 example.com/page.php?v1=abc&v2=def 重写为 example.com/abc/def

    Using Apache s htaccess文件 我正在尝试rewrite网址http example com page php v1 abc v2 def to http example com abc def 到目前为止我有 Opti

随机推荐

  • 是否可以在运行时在 Julia 中创建类型?

    假设我想要一个以下形式的函数 abstract RecordType function CreateRecordType fields names Vector ASCIIString type name ASCIIString magic
  • 在sklearn中将文本列转换为数字

    我是数据分析新手 我正在尝试 python Sklearn 中的一些模型 我有一个数据集 其中某些列具有文本列 就像下面这样 Dataset 有没有办法将这些列值转换为 pandas 或 Sklearn 中的数字 为这些值分配数字是对的吗
  • nltk单词语料库不包含“okay”?

    NLTK单词语料库没有短语 okay ok Okay gt from nltk corpus import words gt words words contains check gt True gt words words contain
  • 使用Python批量编辑csv文件

    我需要编辑几个 csv 文件 实际上 大多数文件都很好 只是最后 第 41 列需要更改 对于该列中特定字符串的每次出现 我需要将其替换为不同的字符串 具体来说 每次出现的 S D 都需要替换为 S 我尝试使用 Python 来完成此操作 但
  • 如果不推荐重新查询,现在如何重新查询游标?

    根据标题 如果我们过去打电话cursor requery 但现在已弃用 现在怎么调用这个函数呢 此方法已被弃用 不要使用这个 只需请求一个新光标 这样您就可以异步执行此操作 并在新光标返回后更新您的列表视图 那么如何请求一个新游标并将其传回
  • devtools::test() 有效,但 devtools::check() 无效。为什么?

    我正在测试this https github com beanumber etlR 包 以下三件事就可以正常工作 devtools test devtools test file tests testthat R Travis CI 与 R
  • 购买和销售 J2ME 应用程序的最佳门户[已关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 任何类型的平台都有很多应用程序商店 但是当我试图找到一家好的商店来购买和销售 j2me 应用程序时 我找到了一些 但没有像我以前使用的那样真正大的商店
  • 在 MySQL 中进行全文搜索的最有效方法

    我有 3 个表 我想查询搜索词文本框 我的查询目前看起来像这样 SELECT Artist FROM Artist Band Instrument WHERE MATCH Artist name AGAINST mysearchterm O
  • 如何在 MySQL 中构建跨数据库查询?

    我在同一台服务器上有两个数据库 谷歌给了我一些提示 但我找不到任何 官方 的东西 有人可以向我指出解释如何执行此操作的文档吗 使用 PHP 进行解释也很有用 谢谢 我在同一台服务器上有两个数据库 如何在 MySQL 中构建跨数据库查询 您可
  • WPF 还是 WinForms 作为内部工具?

    在我的公司 我们开发了许多内部工具 从简单的实用程序到成熟的编辑器 这些工具的首要任务是稳定性 可用性和周转时间 意味着添加新功能的速度 到目前为止 我们一直在使用 WinForms 但有几个新工具正在酝酿中 我正在权衡是否应该继续使用 W
  • 在 Xamarin.Mac 应用程序包上运行 Instruments

    米格尔 德伊卡萨 https stackoverflow com users 16929 miguel de icaza博客上写了关于使用 Instruments 分析使用 Mono 构建的 Mac 应用程序 http tirania or
  • [UIScreen mainScreen].bounds.size 在 iOS8 中变得依赖于方向吗?

    我在 iOS 7 和 iOS 8 中运行了以下代码 UIInterfaceOrientation orientation UIApplication sharedApplication statusBarOrientation BOOL l
  • 如何在 Node.js 中进行多个 API 调用并在每次调用之间有延迟

    我的目标是对数据列表进行多个 api 调用 假设我有以下代码 const axios require axios const axiosRequests const strings a b c for let str of strings
  • 在 webview android 中设置/获取数据

    我有这个网络视图
  • 纯 Haskell 代码需要线程池吗?

    In 现实世界 Haskell 第 28 章 软件事务内存 http book realworldhaskell org read software transactional memory html 开发了一个并发网络链接检查器 它获取网
  • ORTOOLS 中的多个 MILP 解决方案 [python]

    我正在尝试使用 Python 中的 or tools 来解决具有多个最佳解决方案的混合整数线性程序 然而 NextSolution 总是返回False 所以我无法检索多个解决方案 我知道这个函数使用约束求解器工作 但我想使用 MILP 求解
  • 建立 TCP 连接边界的正确方法

    我的问题是关于如何正确处理使用 tcp 连接接收的数据 事实上 通过建立 tcp 连接 创建了一个流 假设我想发送一条有开头和结尾的消息 由于数据在流中流动而没有指定任何边界 我如何识别消息的开始和结束 我想在消息的开头和结尾处放置一些特殊
  • iPhone,如何隐藏标签栏按钮?

    如何隐藏单个标签栏按钮 我已经搜索过 但什么也没找到 只找到了完整的栏 我已经取得了一些进展 但仍然遇到问题 此代码位于我的应用程序委托中 带有选项卡栏的出口 我在其中调用它viewDidLoad选项卡栏中显示的第一个视图的视图 void
  • 有 JUnit Attachments Jenkins 插件工作的示例吗?

    在过去一个小时左右的时间里 我一直在努力让以下工作正常进行 我将附件存储在目标目录中 但它们在班级级别或测试级别的测试页面上都没有链接 我尝试了以下每种组合 放置附件文件夹target surefire reports class 与目标
  • 使用查询参数值进行 NGINX 301 重定向

    我想重定向example com lang en to example com en 我正在使用 Python Django 我的服务器运行 Plesk Nginx 我尝试像这样在我的网页上重定向 但这是行不通的 rewrite lang