RedirectMatch 301 ^/watermeloncakes/ //www.clienturl.com/watermelon-cakes-1/
(I假设
www.clienturl.com
是此站点的主机名。)
好吧,事情是这样的。。。这在任何版本的Apache上都不会起作用!?因为mod\\u alias不支持协议相关URLRedirectMatch
(或Redirect
) 或者为这件事重写mod\\u。
从Apache docs:
新URL可以是以方案和主机名开头的绝对URL,也可以是以斜杠开头的URL路径。在后一种情况下,将添加当前服务器的方案和主机名。
协议相关URL,如//www.clienturl.com/watermelon-cakes-1/
将被视为根相对(“以斜杠开头的URL路径”),因此上述指令将导致格式错误的重定向到:
https://www.clienturl.com//www.clienturl.com/watermelon-cakes-1/
有可能是另一个重定向后来纠正了这一点(可能是在WordPress本身中)!?但在你的
.htaccess
文件
Apache在创建Location
要发送回客户端的标头。它不会发回与协议相关的URL,并期望客户端对其进行解析(如果手动为Location
服务器端脚本中的头)。
如果这些指令有效,那么看起来有人删除了协议(https:
或http:
?) 从目标URL,或添加主机名(//www.clienturl.com
)? 是否可能这些最初被重定向到http:
有人认为他们会试图通过使其“协议相关”来避免“双重重定向”(因为您正在强制HTTPS)?
上述指令需要使用完整的绝对URL:
RedirectMatch 301 ^/watermeloncakes/ https://www.clienturl.com/watermelon-cakes-1/
或使用根相对URL:
RedirectMatch 301 ^/watermeloncakes/ /watermelon-cakes-1/
使用mod\\u rewrite代替
RewriteRule
对于这些重定向,而不是mod\\u别名
RedirectMatch
(或
Redirect
) 指令。这仅仅是因为您应该避免混合来自两个模块的重定向/重写,并且您已经在整个过程中使用了mod\\u rewrite
.htaccess
WordPress本身使用mod\\u rewrite来实现其前端控制器模型。
例如:
RewriteRule ^watermeloncakes/ /watermelon-cakes-1/ [R=301,L]
(无需重复
RewriteEngine
指令。)
Apache模块在整个请求过程中独立地、在不同的时间执行。mod\\u rewrite在mod\\u alias之前执行,而不管.htaccess
文件例如,您可以将所有RedirectMatch
指令,它不会改变执行顺序。
因此,通过混合来自这两个模块的重定向,最终可能会出现意外的冲突,因为mod\\u重写始终优先,而不管顺序如何。而且,所有mod\\u rewrite指令都是在mod\\u别名重定向之前首先处理的-每个请求都会处理所有内容(无论是否有重定向)。如果使用mod\\u rewrite,则会立即发生重定向,并绕过其余指令。
但是,由于所有这些重定向看起来似乎只是在更正URL,否则会触发404的URL,因此最好在服务器端代码(即WordPress)中执行这些重定向。例如,一旦WordPress确定URL将导致404,然后检查您的重定向。这样做可以避免任何重定向代码“减慢”正常的站点使用。