mod_rewrite 删除 GET 变量

2023-12-01

我正在尝试采取

example.com/home?lang=fr&foo=bar

并重定向到

example.com/fr/home?foo=bar

I tried

    RewriteCond %{QUERY_STRING} lang=([a-z]{2})&?
    RewriteRule ^(.*) /%1/$1 [R=307]

但我得到了一个重定向循环。 这是因为在“fr”移动到请求字符串的前面后,lang=fr 并未从查询字符串中删除。这导致:

example.com/fr/fr/fr/fr/fr/fr/fr/fr/fr/....

我可以用

    RewriteRule ^(.*) /%1/$1? [R=307]

但这也从查询字符串中删除了我想保持完整的 foo=bar

我找不到一种从查询字符串中仅删除一个变量的方法。我确信有一个简单的解决方案,但谷歌没有帮助。 谢谢


作为对 @whoisgregg 答案 (+1) 的补充,这是对 apache wiki 的一个很好的改编。那里的规则并不完全好(例如,此页面上通过查询字符串进行的访问控制不会抵抗一点 urlencoding)。

我们有一个适用于测试用例的可行解决方案,但某些扩展测试可能会失败:

RewriteCond %{QUERY_STRING} ^(.*)lang=([a-z]{2})&?(.*)$
RewriteRule (.*) /%2/$1?%1%3 [R=307]

foo.php?foo=bar&novlang=fr&toto=titi => /fr/foo.php?foo=bar&novtoto=titi

这里的lang=检测到部分,但如果任何参数以lang你会有问题的。

所以,我们需要一些修复,我这周一直在研究这个主题,我认为这是一个更好的版本:

RewriteCond %{QUERY_STRING} (.*)(^|&|%26|%20)lang(=|%3D)([^&]+)(.*)$
RewriteRule (.*) /%4/$1?%1%5 [R=307]

foo.php?foo=bar&novlang=fr&toto=titi => not matched (normal, no lang=)
foo.php?foo=bar&lang=fr&toto=titi&b=a => fr/foo.php?foo=bar&toto=titi&a=b

这里唯一悬而未决的问题是lang可能是部分或完全 url 编码并且不会被检测到,但这种情况很少见。我还删除了 lang 值仅包含 2 个字符的控制。我认为([^&]+)更好,这意味着所有字符,直到我匹配&.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mod_rewrite 删除 GET 变量 的相关文章

随机推荐

  • Codeigniter 查询生成器在 where_in 中使用 implode 函数

    这是我使用 implode 函数的正常 sql 查询 SELECT from search result WHERE skills IN implode s id 现在我想将其转换为 codeigniter 形式 我尝试了以下代码 但失败了
  • Unicode 组合字符的实际最大数量是多少?

    我正在寻找在非组合字符之后出现的 unicode 组合字符的最大数量在现实的自然文本中 我知道在 unicode 文本中 文本中的任何位置都可以放置任意数量的组合 但是 我正在编写一个专门的应用程序 该应用程序必须在资源有限的情况下运行 并
  • React - 从同级组件调用函数

    假设我有一个组件树 如下所示
  • 在基于 iframe 的文本编辑器中禁用 Firefox 和 Chrome 拼写检查

    有很多关于如何禁用 html 中的拼写检查的信息textarea元素通过使用spellcheck false 然而 要使文本区域具有更高级的功能 必须使用iframe with designMode on 参见例如这一页 这是在 GWT 中
  • 使用 C# 错误,可空对象必须具有值 datetime

    我在 C datetime 中遇到一个问题 我已经尝试了很多时间 它不是 给出问题的解决方案 所以给我一个解决方案 var accommodationcategoryList EmployeeAttendanceCacheMaster Ge
  • sprintf():作为参数的小数位数

    目前的解决方案是 dp lt 2 sprintf paste0 dp f 0 123 期望的解决方案没有 Paste0 并且类似于 sprintf 2 d f 0 123 2L 除了它有效之外 您可以使用 插入dp进入格式 dp lt 2
  • 使用“push”或“sub”x86 指令时,堆栈内存是如何分配的?

    我已经浏览了一段时间 我试图了解在执行以下操作时如何将内存分配给堆栈 push rax 或者移动堆栈指针为子例程的局部变量分配空间 sub rsp X Move stack pointer down by X bytes 我的理解是 堆栈段
  • 我可以信任 imageres.dll 系统图标索引吗?

    我制作了一个自定义目录树控件 它使用从中提取的系统图标imageres dll文件 我的意思是该文件是从 Windows 目录中读取的 因此根据 Windows 版本 该文件会有多个版本 下面是确切的 C 片段 ImageList Imag
  • javascript 中的 MM/DD/YYYY HH:MM:SS AM/PM 日期验证正则表达式

    我正在尝试在 JavaScript 中验证 MM DD YYYY HH MM SS AM PM 格式的日期 我无法找到任何好的答案 尝试了其他结果但没有成功 在以下问题中 asp net 已提出此问题 但 javascript 未提出此问题
  • ajax请求不同的主机

    我的网页中有以下 JavaScript var xhr new XMLHttpRequest xhr open GET http www google com true xhr onreadystatechange function if
  • SPARK - 在数组中的值上连接 2 个数据帧

    我找不到一种简单而优雅的解决方案来解决这个问题 我有一个 df1 与此列 guitars array nullable true element long containsNull true 我有一把吉他制成的 df2 还有一个与我的 df
  • 在 HTML 中查找单词

    我试图在 HTML 字符串中找到给定的单词并在其周围添加一个跨度 我现在正在做的是这样的 function find what String where String var regexp RegExp new RegExp what gi
  • JTable 不显示列名称

    这是我的代码 public class DownloadMainView extends JFrame private ArrayList
  • 如何通过 Windows API 访问系统规格?

    如何从 Windows API 访问有关计算机规格的信息 我需要查看注册表吗 如果需要的话 在哪里 我希望我的程序能够访问的一些关键信息包括显卡型号和规格 支持的 OpenGL 和 DirectX 版本 支持的屏幕分辨率 CPU 信息 总
  • SQL批量复制内存问题

    我们在 C 中使用 SqlBulkCopy 类 在sql中插入批量数据 我们有一个包含 1000 万条记录的表 我们正在循环中批量插入 10 000 条数据 我们面临物理内存问题 内存增加而不是减少 下面是我们的代码 当使用sql批量复制时
  • 使用 Zenhub API 从 Github 问题创建史诗

    这是一个后续问题如何使用 zenhub 设置问题管道 我正在尝试在 Python 脚本中将问题转换为史诗 我可以将问题转换为史诗 但当我尝试在创建史诗时添加问题时 出现错误 这有效 zenhub headers X Authenticati
  • 使用 Google Checkout 轮询 API 验证 Android 应用内购买时出现延迟

    我正在尝试使用 Google Checkout API 从我的服务器验证 Android 应用内购买 根据另一个查询 Android 市场上的应用程序 没有 HTTP 通知 我没有收到回调 所以我使用轮询 API 它工作正常 只是在轮询收到
  • BackgroundWorker 线程必须是 STA

    我有一个BackgroundWorker来调用一个函数来在BackgroundWorker DoWork上执行一个很长的过程 当函数中发生错误时我会提示一个自定义的消息框 WPFMessageBoxResult result WPFMess
  • 双击突出显示单元格值以进行复制

    我有一个jqGrid 我想突出显示一行 ondbClickRow 中的特定单元格 这将使用户能够轻松地将单元格的值复制到剪贴板 有人可以指导我如何做到这一点吗 谢谢 一般来说这是可能的 但您可能应该关闭行选择以立即看到突出显示 所以代码如下
  • mod_rewrite 删除 GET 变量

    我正在尝试采取 example com home lang fr foo bar 并重定向到 example com fr home foo bar I tried RewriteCond QUERY STRING lang a z 2 R