如何使用htaccess和regex删除URL中的重复和不必要的部分?

时间:2021-07-25 作者:Karra

我想永久重定向一些已被删除的URL,而机器人坚持遵循它。我有默认的WordPress配置.htaccess.

www.example.com/customers/em/customers/any-url 

www.example.com/customers/any-url
以及

www.example.com/any-url/map/?str=Av+street+Fight,+19&cit=Alabama&sta=San+Paolo 

www.example.com/customers/any-url
我的htaccess:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

1 个回复
SO网友:MrWhite

我想any-url 任何URL路径都像foofoo/bar/baz/something, 但不是什么都没有。

请尝试以下操作:

# Redirect "/customers/em/customers/any-url" to "/customers/any-url"
RewriteRule ^(customers)/em/customers/(.+) /$1/$2 [R=301,L]
The$1 backreference包含;“客户”;(保存重复)从RewriteRule 图案。以及$2 backreference包含any-url 部分请求中可能存在的任何查询字符串都会原封不动地传递。

关于URL/any-url/map/?str=Av+street+Fight,+19&cit=Alabama&sta=San+Paolo, 您实际上并没有说明查询字符串是文本还是变量-我假设查询字符串是文本,并且必须与所写内容完全匹配。在这种情况下,您需要执行以下操作:

# Redirect "/any-url/map/?str=<value>" to "/customers/any-url"
RewriteCond %{QUERY_STRING} =str=Av+street+Fight,+19&cit=Alabama&sta=San+Paolo
RewriteRule ^(.+)/map/$ /customers/$1 [QSD,R=301,L]
The= CondPattern上的前缀运算符RewriteCond 指令)使其成为字典式字符串比较(而不是正则表达式),因此字符串按字面匹配。

这个QSD 上的标志RewriteRule 指令是丢弃初始请求中的查询字符串所必需的。

但是,如果str URL参数应接受任何非空值,然后将上述CondPattern更改为:^str=..

这些重定向需要转到的顶部.htaccess 文件,在现有指令(WordPress前端控制器)之前,否则它们可能无法处理。

您还应该首先使用302(临时)重定向进行测试,并且只有在完全测试它们是否按预期工作后,才可以更改为301(永久)重定向。浏览器会持久缓存301s,因此可能会导致测试出现问题。

确保在测试之前清除浏览器缓存。

参考号:

相关推荐

HTAccess重定向-替换特殊字符

在我的previous post, 我问过如何301重定向所有.com/language/X URL到.com/members/?members_search=X 使用htaccess。谢天谢地,我得到了帮助,解决办法是RewriteRule ^language/(.*) /members/?members_search=$1 [R=301,L]我刚刚发现,我还需要将任何现有连字符转换为空格。我假设不会有超过2个连字符。测试用例http://example.com/language/american-en