【问题标题】:Custom wordpress HTTP redirects to HTTPS breaks website自定义 wordpress HTTP 重定向到 HTTPS 中断网站
【发布时间】:2020-02-17 21:14:36
【问题描述】:

我在.htaccess 文件中添加了额外的规则。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule !^/articles/(.*)$ https://%{HTTP_HOST}/index.php?name=$1 [L,R=301]
RewriteRule ^(articles/)(.*)$ https://%{HTTP_HOST}/index.php?name=$2 [L,R=301]
</IfModule> 

我有两个似乎可行的条件:

  • http://example.com/this-is-old-url/符合第一个重写规则

  • http://example.com/articles/this-is-old-url/符合第二条规则

但问题是,添加这些规则后,我的网站开始到处进行重定向。例如,我无法访问更改为 https://example.com/index.php?name= 的域 https://example.com。我所有的网站链接都断开了。

我做错了什么?

【问题讨论】:

  • 只需为您的this-is-old-url 制定特定规则。所有非 atricles 的 URL 也都匹配第一条规则。

标签: php wordpress .htaccess redirect


【解决方案1】:
RewriteCond %{HTTPS} off
RewriteRule !^/articles/(.*)$ https://%{HTTP_HOST}/index.php?name=$1 [L,R=301]
RewriteRule ^(articles/)(.*)$ https://%{HTTP_HOST}/index.php?name=$2 [L,R=301]

第一条规则匹配所有内容,因为RewriteRule pattern.htaccess 上下文中匹配的 URL 路径从不以斜杠开头(您似乎已经在您的第二条规则中认识到了这一点)。您也不能在否定 patterns 中捕获组 - 根据定义,否定模式实际上不匹配任何内容。

对于 HTTP 和 HTTPS,第二个规则无条件执行,因为 RewriteCond 指令仅适用于随后的第一个 RewriteRule。 (但这两条规则无论如何都可以合二为一。)

要在外部“重定向”(根据您的示例)http://example.com/this-is-old-url/(或 http://example.com/articles/this-is-old-url/)形式的 URL 到 https://example.com/index.php?name=this-is-old-url,然后您可以在 .htaccess 文件的顶部执行以下操作:

RewriteCond %{HTTPS} off
RewriteRule ^(?:articles/)?([\w-]+/)$ https://%{HTTP_HOST}/index.php?name=$1 [R=301,L]

更新: 正则表达式现在包括 -(连字符)和尾部斜杠。请注意,尾部斜杠包含在捕获组中。因此,它重定向到/index.php?name=this-is-old-url/(带有斜杠)。

子模式(?:articles/)? 是可选的且不可捕获。因此,这条规则与您的两个示例 URL 匹配。

&lt;IfModule&gt; 包装器不是必需的。 RewriteEngine 指令也不是,因为您可能已经在后面的 WordPress 代码块中拥有它。

你不一定需要暴露index.php,你可以重定向到/?name=...,假设DirectoryIndex设置正确。

您需要在测试前清除浏览器缓存。 (最好先使用 302 - 临时 - 重定向进行测试。)

我无法访问我的域 https://example.com,该域更改为 https://example.com/index.php?name=

只有在您请求 http://example.com(注意 HTTP,而不是 HTTPS)时,您现有的规则才不会发生这种情况。

【讨论】:

  • 感谢您的回答。我试图测试您添加的新规则,但我认为它不起作用。检查此链接link。实际上我将我的重写规则更改为RewriteRule ^(.*[/])?(.*/)$ https://%{HTTP_HOST}/index.php?name=$2 [L,R=301],我认为它有效,但是我看到如果我输入example.com/wp-admin(不添加最后一个/)我会以某种方式重定向,即使在https中。
  • 抱歉,我错过了正则表达式中的连字符 (-) 和斜杠!我已经更新了我的答案以包括这个。不确定最后一句话是什么意思...您发布的 URL 似乎是 HTTPS(因此这些规则不适用)?但是/wp-admin 通常是一个物理目录,因此如果省略,mod_dir 将通过 301 重定向自动附加尾部斜杠。 301 重定向自然会被浏览器缓存。
  • 我会把我的正则表达式改成你的,因为它看起来更容易理解,当我用 wp-admin 测试时,我不小心写了 http,而不是 https :) 谢谢你的时间和回答!
猜你喜欢
  • 2017-01-22
  • 1970-01-01
  • 2021-05-11
  • 1970-01-01
  • 2016-10-07
  • 2013-07-03
  • 1970-01-01
  • 2016-09-01
  • 1970-01-01
相关资源
最近更新 更多