- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经搜索了几个 SO 帖子,但没有找到我要找的东西。它可能存在,但可能已经足够老了,不会出现在我面前。我找到了一个帖子 ( Nginx rewrite: add trailing slash, preserve anchors and query strings ) 非常接近我的需要,但它的正则表达式解决方案不适用于 IIS 的 URL 重写,除非我做错了。
问题
我正在尝试将正斜杠 /
添加到我的 url 路径的末尾,同时还保留任何现有的查询字符串 ?
和 anchor #
.
所需的解决方案
基本上,这是每个问题的预期结果:
Entry: https://my.site.com/about
Result: https://my.site.com/about/
Entry: https://my.site.com/about?query=string
Result: https://my.site.com/about/?query=string
Entry: https://my.site.com/about#TestAnchor
Result: https://my.site.com/about/#TestAnchor
Entry: https://my.site.com/about?query=string#TestAnchor
Result: https://my.site.com/about/?query=string#TestAnchor
当前测试
我们当前的正则表达式忽略了查询字符串和 anchor ,但我现在想考虑它们。
<rule name="AddTrailingSlash" stopProcessing="true">
<match url="^([^.?]+[^.?/])$" />
<action type="Redirect" url="{R:1}/" redirectType="Permanent" />
</rule>
我还测试了另一个正则表达式,但它仅在 url 同时包含查询字符串和 anchor 时才有效。
<rule name="AddTrailingSlash" stopProcessing="true">
<match url="^(.*)(\?.*?)(\#.*?)$" />
<action type="Redirect" url="{R:1}/{R:2}{R:3}" redirectType="Permanent" />
</rule>
注意: 我刚刚测试了最后一个 (^(.*)(\?.*?)(\#.*?)$
) 它实际上不起作用。如果 url 在 ?
之前已经包含 /
,则测试通过,但它不应该通过,所以我在这里还有更多工作要做。
问题
我可以使用一个正则表达式来解决这个问题,还是我需要使用多个规则?
最佳答案
尾部斜杠
重写(所有)URI 并保留 Fragment
和 Query Strings
<rule name="AddTrailingSlash" stopProcessing="true">
<match url="^([^/]+:\/\/[^/#?]+|[^?#]+?)\/?((?:[^/?#]+\.[^/?#]+)?(?:[?#].*)?$)" />
<action type="Redirect" url="{R:1}/{R:2}" redirectType="Permanent" />
</rule>
IIS use ECMAScript所以你可以在这里尝试: https://regexr.com/6ele7
尾部斜杠
重写(考虑)URI 并保留 Fragment
和 Query Strings
<rule name="AddTrailingSlash" stopProcessing="true">
<match url="^([^/]+:\/\/[^/#?]+|[^?#]+\/[^/.?#]+)([?#].*)?$" />
<action type="Redirect" url="{R:1}/{R:2}" redirectType="Permanent" />
</rule>
在此处尝试: https://regexr.com/6fk3g
http://127.0.0.1 --> http://127.0.0.1/
https://localhost --> https://localhost/
https://localhost? --> https://localhost/?
https://localhost/ --> https://localhost/
https://my.site.com --> https://my.site.com/
https://my.site.com:443? --> https://my.site.com:443/?
https://my.site.com/ --> https://my.site.com/
https://my.site.com/about.php --> https://my.site.com/about.php
https://my.site.com/about.php? --> https://my.site.com/about.php?
https://my.site.com/about --> https://my.site.com/about/
https://my.site.com/about? --> https://my.site.com/about/?
https://my.site.com/about/ --> https://my.site.com/about/
https://my.site.com/about/? --> https://my.site.com/about/?
https://my.site.com/about?query --> https://my.site.com/about/?query
https://my.site.com/about/?query --> https://my.site.com/about/?query
https://my.site.com/about.php?query --> https://my.site.com/about.php?query
https://my.site.com/about#hash --> https://my.site.com/about/#hash
https://my.site.com/about/#hash --> https://my.site.com/about/#hash
https://my.site.com/about.php#hash --> https://my.site.com/about.php#hash
https://my.site.com/about?query#hash --> https://my.site.com/about/?query#hash
https://my.site.com/about/?query#hash --> https://my.site.com/about/?query#hash
https://my.site.com/folder.name/about?query --> https://my.site.com/folder.name/about/?query
https://my.site.com/about?query#hash:http://test.com?q --> https://my.site.com/about/?query#hash:http://test.com?q
^([^?#]+?)\/?([?#].*)?$
第 1 组: ^
首先,[^?#]
除了 ?
/#
, Go much but lazy +?
(先停下来,看下一个)
忽略: \/?
那么如果/
是否存在
第 2 组: [?#]
= ?
/#
和 .*
旁边的任何字符直到 $
结束,(...)?
如果存在
效果很好。 但是它不适合处理:
https://my.site.com/about.php?query --> https://my.site.com/about.php/?query !!!
所以让我们添加一个异常(exception)......
Name.name.name.ext
作为 Group #2 会怎样?^([^?#]+?)\/?((?:[^/?#]+\.[^/?#]+)?(?:[?#].*)?)$
(?:...)
非捕获组([^/?#]+\.[^/?#]+)?
寻找任何可能的文件名或 (?:[?#].*)?
任何可能的查询或 anchor 字符串
现在一切正常,除了这个:
https://my.site.com? --> https://my.site.com? !!!
所以我们需要在组 #1
中另一个异常(exception)^([^/]+:\/\/[^/#?]+|[^?#]+?)\/?((?:[^/?#]+\.[^/?#]+)?(?:[?#].*)?$)
(...|...)
备选方案[^/]+:\/\/[^/#?]+
首先检查(不是懒惰)是否有像 ...://...
这样的模式直到 /# ?
不存在?
现在效果很好!
.
& /
字符集以匹配考虑的 URI 和忽略别人?^([^/]+:\/\/[^/#?]+|[^?#]+\/[^/.?#]+)([?#].*)?$
\/[^/.?#]+
检查最后一个/
之后的字符集是否不是/.?#
现在它更小更快了!
作为@károly-szabó回答得好here ,而不是寻找不接受的字符集,我们可以寻找匹配的模式。
因此,如果我们想使用该方法但以更简单的方式(2 组)(+ 一些小的优化),正则表达式将是:
^(https?:\/\/[\w.:-]+\/?(?:[\w.-]+\/)*[\w-]+(?!\/))([?#].*)?$
但是 URI path Accepted characters更多。
因此,该 Regex 的更广泛版本可以是:
^(https?:\/\/[\w.:-]+\/?(?:[\w!#-)+-.;=@~]+\/)*[\w!#-);=@~+,-]+(?!\/))([?#].*)?$
在这里试试:https://regexr.com/6elea
注意:仍然是“multibyte Unicode 作为允许的域名”,但我在此方法中忽略了这一点。
实际上我认为我们不应该在 IIS 上重写它,原因如下:
#
可以是文件夹名称的一部分(by %23
)我的意思是:
https://my.site.com/ --> (=Call root)
https://my.site.com/about --> (=Call root > Folder/File name about)
https://my.site.com/about/ --> (=Call root > Folder name about)
https://my.site.com/about?query --> (=Call root > Folder/File name about + Query)
https://my.site.com/about/?query --> (=Call root > Folder name about + Query)
https://my.site.com/about.php?query --> (=Call root > File name about.php + Query)
[When browser strip it:]
https://my.site.com/about#hash --> (=Call root > Folder/File name about + Anchor)
https://my.site.com/about/#hash --> (=Call root > Folder name about + Anchor)
https://my.site.com/about.php#hash --> (=Call root > File name about.php + Anchor)
[If not?]
https://my.site.com/folder#name/?query#hash
https://my.site.com/folder.name/about.php?query=one/two
关于regex - IIS Url 重写 : Add Trailing Slash, 保留 anchor 和查询字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70670470/
让我首先描述一下问题的症状。然后我将提供更多事实并解释我的问题。 症状 我编写了一个自定义 Windows 控件。控件会自行绘制以响应 WM_PAINT 消息。它还使用跟踪工具提示(即TOOLTIPS
你好,我设计了一个迷宫,我想在“人”从一个单元格移动到另一个单元格时在单元格之间画一条路径。所以每次我移动单元格时都会画一条线我也在使用图形模块 The graphics module is an o
我可以使用 Graphics2D 制作一个能够自行构建且没有“Swing ”效果的平滑圆圈吗?如果是,怎么办?要理解我的意思,您必须运行以下示例: import java.awt.Color; imp
当我第一次关注LinkedBlockingQueue中的unlink方法时,我认为trail的第二个参数意味着它是第一个参数-p的下一个节点,但是我错了,因为我在remove方法中发现(Object
我有一个中心节点来描绘太阳,还有另一个围绕它运行的节点来描绘行星。我想用圆圈表示行星轨道。 我尝试创建一个环面几何体,这可行,但问题是当相机关闭时它会增大,而当相机太远时它会消失。 有没有办法使某些东
在图像中,红色轨迹是当我在 Sprite 周围添加了一个边界矩形时 pygame 创建的轨迹。 Sprite 也这样做,最简单的解决方案是在每次重绘后将表面清除为黑色。然而,尝试在整个主表面上这样做并
我正在尝试使用 Update 命令删除 MySQL 文本类型数据字段中的回车符。我已经尝试了以下操作,当我导出记录并在文本编辑器中查看(附图)时,我仍然看到这个字符?我应该用什么来删除它? updat
我是 swift 的新手。正在阅读 weheartswift 上的闭包。有一节讨论尾随闭包。这里有三个问题: 我认为代码中存在一些拼写错误:函数不应该只是 func 吗? 我认为 { } 中的 3 行
这是我在编程教程中发现的一个术语。什么意思? 最佳答案 它通常指的是解析文本行之类的东西,它描述了从行尾删除的换行符或回车符。 换行符 对最终用户来说通常是不可见的,但它代表了一个结束一行并开始新一行
我正在尝试将以下自动命令插入 Vim: autocmd BufEnter *.c :call SourceTagsVim() function! SourceTagsVim() let s:fname
我在一个明显不幸的环境中工作,这种环境几乎不担心被称为“尾随空白”的深层邪恶......但是,唉,开明的 Mercurial 坚持警告我,通过差异中的红色突出显示,该代码我将检查包含这个邪恶的东西。
我试图改变我的崇高主题/配色方案,我得到了 'unexpected trailing characters' 当我尝试使用此配置保存/User/Preferences.sublime-settings
我有一个类似于this的日志文件。 我正在尝试通过以下方式解析Message列中的JSON: library(readr) library(jsonlite) df % glimpse() ##
是否可以为 PaperTrail 指定不同的表名(versions 除外)? gem ? 在我的 Rails 应用程序中,我已经有了一个版本模型/表,它与事件记录版本控制无关(我的应用程序让我们使用
我正在使用 .htaccess 文件将目录请求定向到提供有关该目录的信息的自定义 php 文件(我希望浏览器显示的 url 不会更改)。 这是 .htaccess 文件的相关部分。 RewriteCo
我正在尝试查找Twitter句柄的所有实例,并在它们周围包裹一个定位标记。 :%s/\(@[\w]\)/\1/gc 这给了我: E488: Trailing characters 最佳答案 当/和{p
我找到了一个简单的代码来进行审计跟踪,但它仅适用于单个单元格。 如果有人复制粘贴几个单元格,它就会停止工作。一次删除几个单元格也是如此。 Option Explicit Dim PreviousVal
这个问题在这里已经有了答案: java.lang.NoSuchMethodError: org.springframework.util.ClassUtils.forName(Ljava (3 个答
这个问题在这里已经有了答案: java.lang.NoSuchMethodError: org.springframework.util.ClassUtils.forName(Ljava (3 个答
在 Firefox 3.5 中,使用 jQuery 为 ASP.net 文本框设置动画时,焦点会留下尾随动画。 将输入框修改为无边框后,效果不再可见。顶部框没有边框,也没有拖尾动画,而有边框的底部框仍
我是一名优秀的程序员,十分优秀!