假设我有以下网址:
https://mywebsite.com/pages.html?limit=24&start=7440&t=3349.html.html.html
https://mywebsite.com/pages.html.html.html?limit=24&start=8136&t=3358
https://mywebsite.com/pages.html.html?limit=24&start=8136&t=3358.html.html.html.html
如何去掉重复的“.html”部分,只留下一个?
这是一个复杂的情况,经过两个小时的努力,我仍然找不到使用正确的正则表达式来使其工作的方法。
这是我尝试过的:
RewriteEngine On
RewriteBase /
RewriteCond %{QUERY_STRING} ^(.*)((.html){2,})(.*)$
RewriteRule ^(.*)$ https://mywebsite.com/%1%4 [QSA,R=302,L]
我使用 302,因为它是一个临时解决方法,直到我找到解决此问题根源的可行解决方案,但我不断遇到重定向循环。
我想只保留一个 .html,删除所有多次出现的 .html。
示例1:
https://mywebsite.com/pages.html?limit=24&start=7440&t=3349.html.html.html
should redirect to:
https://mywebsite.com/pages.html?limit=24&start=7440&t=3349.html
和
https://mywebsite.com/pages.html.html?limit=24&start=8136&t=3358.html.html.html.html
should redirect to:
https://mywebsite.com/pages.html?limit=24&start=8136&t=3358.html
很抱歉提出这个问题,但这对我来说特别棘手,我找不到解决方案。
提前致谢。
这里有几个问题:
/pages.html
)%1%4
)移动到 URL 路径(而不是查询字符串)中。如果应该的话?%1%4
。QSA
)。这最终会导致重定向循环。.html
如果在查询字符串中仅重复一次,则会失败。(这会发生吗,就像 URL 路径中出现的那样?)在您的示例中,倍数
.html
始终出现在 URL 末尾和/或查询字符串末尾。因此,正则表达式中的尾随(.*)
似乎是不必要的(因为在重复的.html
序列之后没有发生任何事情)。请尝试以下方法:
通过这 2 条规则,最多只有 1 个重定向。第一条规则处理
.html
查询字符串中的错误倍数,同时更正 URL 路径。第二条规则仅处理 URL 路径(当查询字符串已经正确时)。请注意,尾随(
?
的.+?
一部分(.+?\.html)(\.html)*$
) 使前面的量词变得非贪婪,因此我们消耗尽可能少的量。换句话说,我们只消耗.html
第一个捕获组中的一个实例,而不是所有内容.html
(或除了第二个规则中的最后一个实例之外的所有内容)。只是第一条规则和第二条规则之间的正则表达式存在细微差别:
(.+?\.html)(\.html)*$
和(.+?\.html)(\.html)+$
。在第一个 (*
) 中,附加尾随.html
是可选的,但在第二个 (+
) 中,附加尾随是强制性的。QSA
任一规则都不需要该标志。在第一条规则中,我们重建查询字符串,因此原始查询字符串被丢弃(默认情况下)。在第二条规则中,默认情况下会传递查询字符串(已经正常)。该
NE
标志在第一条规则中使用,因为反向引用(从QUERY_STRING
服务器变量捕获)已经经过 URL 编码。单个
R
标志默认为 302(临时),但为了可读性,明确显示可能会有所帮助。