【问题标题】:.htaccess non-www to www and http to https redirects.htaccess 非 www 到 www 和 http 到 https 重定向
【发布时间】:2017-06-16 17:19:50
【问题描述】:

由于某种原因,我的重定向不起作用。我只希望非 www 去 www 和 non-https 去 https。这就是我所拥有的。来自this post

RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
RewriteRule (.*) https://www.example.com/$1 [R=301,L]

RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
RewriteCond %{HTTP:X-Forwarded-Proto} !=https
RewriteRule (.*) https://www.example.com/$1 [R=301,L]

编辑:这是我的整个文件。

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On

RewriteBase /
RewriteCond %{HTTPS} Off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

RewriteCond %{HTTP_HOST} blog.example.com
RewriteRule ^(.*)$ https://www.example.com/blog/$1 [R=permanent,L]

RewriteCond %{HTTP_HOST} ^example.com/blog/$ [NC]
RewriteRule (.*) https://www.exmaple.com/blog/$1 [R=301,L]

RewriteCond %{HTTP_HOST} ^www.example.com/blog/$ [NC]
RewriteCond %{HTTP:X-Forwarded-Proto} !=https
RewriteRule (.*) https://www.example.com/blog/$1 [R=301,L]

RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

【问题讨论】:

  • 哪个 URL 没有重定向?
  • 任何以 http 开头或没有 www 的内容。一开始。我已经测试过了,如果不是脚本,那就是另一个问题了。
  • 验证您的.htaccess 是否启用,方法是在您的.htaccess 顶部放置一些垃圾(随机)文本,并查看它在您访问时是否生成500(内部服务器)错误您在浏览器中的页面。 500 错误意味着 .htaccess 已启用。
  • 这是您完整的.htaccess 文件吗?
  • 好的,我已经添加了文件@user82217的其余部分。

标签: apache .htaccess redirect mod-rewrite


【解决方案1】:

我只想让非 www 访问 www,非 https 访问 https。

您最初拥有的内容很接近,但这取决于 SSL 证书的管理方式。如果 SSL 由前端代理管理(例如 Cloudflare flexible-SSL/FREE 选项),那么它可能没问题。但是,如果 SSL 证书直接安装在您的服务器上,则可能不会。

尝试类似:

# Non-www to www
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule (.*) https://www.%{HTTP_HOST}/$1 [R,L]

# Non-SSL to SSL
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}/$1 [R,L]

这假设您只有example.comwww.example.com,没有其他子域。但是,在您编辑的代码中,您引用了 blog 子域 - 只要您首先包含 blog 重定向,就可以了。

目前这是一个临时 (302) 重定向。仅当您确定它工作正常时,才将 R 更改为 R=301(永久)。

在测试之前确保你的浏览器捕获是清晰的。

总结

完整的代码如下所示:

# Redirect blog subdomain to main domain (required?)
RewriteCond %{HTTP_HOST} ^(www\.)?blog\.example\.com
RewriteRule (.*) https://www.example.com/blog/$1 [R=301,L]

# Non-www to www
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule (.*) https://www.%{HTTP_HOST}/$1 [R=301,L]

# Non-SSL to SSL
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}/$1 [R=301,L]

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On    
RewriteBase /

RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

最好不要在# BEGIN WordPress 块之间进行编辑,以免您的自定义代码被 WordPress 覆盖。

只在你的代码中包含一次RewriteBase 指令(只有最后一个实例会做任何事情)。目前,RewriteBase 指令实际上并没有做任何事情,因为您没有相对路径替换。

【讨论】:

  • 非常感谢您将这些放在一起。你提出了一个关于代理的好观点。我们确实有一个反向代理设置,因此我们可以在 Windows 服务器的子目录中(在 linux 服务器上)有一个 wordpress 博客。所以我不确定这是否会干扰。无论哪种方式,我都备份了 .htaccess 文件并添加到您的示例中。以下是发生的情况:1)如果我转到非 http url,它会将我重定向到 windows 服务器上的 404 页面 2)如果我尝试使用 https 和非 www,它会做同样的事情。我认为您可能对 SSL 的设置方式有所了解,因为我不会考虑到这一点。
  • 既然你得到一个404,大概是重定向到错误的URL?你请求什么 URL,你被重定向到什么 URL 以及所需的 URL 是什么?
  • 我尝试了 2 种类型。 1)example.com/blog/postname - 它重定向到example.com/notfound.aspx(Windows 主机)。第二个 2) example.com/blog/postname - 重定向到example.com/notfound.aspx @user82217
猜你喜欢
  • 2013-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-12
  • 1970-01-01
  • 2019-08-12
  • 2018-09-26
  • 2013-04-22
相关资源
最近更新 更多