【问题标题】:Need to redirect to HTTPS using my current htaccess需要使用我当前的 htaccess 重定向到 HTTPS
【发布时间】:2019-12-07 21:46:13
【问题描述】:

我想将 HTTP 和 www 重定向到 https://example.com

我尝试使用:

# force HTTPS and www.
RewriteEngine On
RewriteCond %{HTTP_HOST} (?!^www\.)^(.+)$ [OR]
RewriteCond %{HTTPS} off
RewriteRule ^ https://www.%1%{REQUEST_URI} [R=301,L]

但结果只有https://www. - 域消失了!

我现在的.htaccess

<IfModule mod_rewrite.c>
# REWRITE ENGINE CONFIG
#ExpiresActive On
DirectoryIndex under_construction.html index.html index.php
#Header set Cache-Control "max-age=259200, public"
#ExpiresDefault "access plus 3 days"
#Header unset ETag
#FileETag None

# Expires header for static content
#<FilesMatch "\.(ico|jpg|jpeg|png|gif|js|css|swf|jgz|js.jgz)$">
#Header set Cache-Control "max-age=31536000, public"
#ExpiresDefault "access plus 11 months"
#</FilesMatch>

# Auth for non-public projects
#AuthName "ZEN 2.2 Login"
#AuthType Basic
#AuthUserFile /Applications/MAMP/htdocs/username/.htpasswd
#AuthUserFile F:/wamp/www/username/.htpasswd
#AuthGroupFile /dev/null
#require valid-user

# REWRITE CORE RULES RULES -- PLEASE DON'T MODIFY --
# THESE ARE THE MAIN REWRITES THAT MAKE THE ENTIRE WORLD SPIN

AddDefaultCharset UTF-8

# IF NO IMAGE FOUND
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} \.(gif|jpg|jpeg|png)$
RewriteRule .* resources/static/images/no_image.png [L]

RewriteCond $1 !^(index\.php|resources|robots\.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?page=$1&%{QUERY_STRING} [L,QSA]
RewriteRule ^robots.txt$ resources/static/robots.php [L]

# gZip minified js files
RewriteCond %{HTTP:Accept-Encoding} gzip
RewriteCond %{REQUEST_FILENAME}.jgz -f
RewriteRule (.*)\.js$ $1\.js.jgz [L]
AddType "text/javascript" .js.jgz
AddEncoding gzip .jgz

# gZip minified css files
RewriteCond %{HTTP:Accept-Encoding} gzip
RewriteCond %{REQUEST_FILENAME}.jgz -f
RewriteRule (.*)\.css$ $1\.css.jgz [L]
AddType "text/css" .css.jgz
AddEncoding gzip .jgz
</IfModule>

需要一些帮助,将 HTTPS 和非 WWW 的重定向添加到当前的 .htaccess 文件中。

从这里使用代码时的问题 -> https://gist.github.com/vielhuber/f2c6bdd1ed9024023fe4

是不是重定向坏了,结果只有https://www.,没有显示域名。

【问题讨论】:

  • 我想将 http 和 www 重定向到 https.example.com 你确定不是example.com 重定向到example.com?

标签: .htaccess https


【解决方案1】:

试试:

# force HTTPS and www.
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [OR]
RewriteCond %{HTTPS} !on
RewriteRule ^(.*)$ https://%1%{REQUEST_URI} [R=301,QSA,L]

在使用 http 协议时,某些网络服务器不会创建 HTTPS 标头。因此,如果HTTPSnot on(是offnull),则此条件为真。

【讨论】:

  • 这样做的问题是第一个条件不会总是成功(当请求HTTP + 非www时),所以不会总是设置%1反向引用。
  • 结果很奇怪,它没有被重定向,但它给出了“这个页面不工作”
【解决方案2】:
# force HTTPS and www.
RewriteEngine On
RewriteCond %{HTTP_HOST} (?!^www\.)^(.+)$ [OR]
RewriteCond %{HTTPS} off
RewriteRule ^ https://www.%1%{REQUEST_URI} [R=301,L]

这个代码的问题是,正如前面的评论所暗示的,它试图重定向到www,而不是域顶点。但它也存在根本性缺陷,因为第一个条件并不总是满足(当 HTTPS 为 off 并且请求 www 时),因此并不总是设置 %1 反向引用(因此域名从重定向 - 如您所见)。

如果您想要一个通用(即没有明确说明主机名)解决方案,那么您需要执行以下操作:

 RewriteEngine On
 RewriteCond %{HTTP_HOST} ^www\. [OR]
 RewriteCond %{HTTPS} off
 RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)
 RewriteRule ^ https://%1%{REQUEST_URI} [R=301,L]

上述规则块声明...对于 www 子域或 HTTP 的所有请求,然后重定向到 HTTPS,减去同一 URL 路径中的 www 子域(如果有)。

第三个条件(必须始终匹配)的目的是简单地捕获主机名减去 www 子域(如果有)。然后使用RewriteRule 中的%1 反向引用替换

注意:首先使用 302(临时)重定向进行测试以避免缓存问题。

您需要在测试前清除浏览器缓存。

更新:它正在重定向到domainname.com:443

上述指令不应该发生这种情况,除非 port 可能明确包含在请求中? (但这是httphttps 的重定向吗?)

您可以尝试将第三个条件更改为:

RewriteCond %{HTTP_HOST} ^(?:www\.)?([^:]+)

硬编码规范的主机名,这可以说是更可取和更可靠(不了解您的系统)。例如:

 RewriteEngine On
 RewriteCond %{HTTP_HOST} ^www\. [OR]
 RewriteCond %{HTTPS} off
 RewriteRule ^ https://example.com%{REQUEST_URI} [R=301,L]

使用此硬编码解决方案,它不可能重定向到规范 URL 以外的任何内容 - 无论请求或系统配置如何。


EDIT#1:如果我完全删除 htaccess 文件,如果从 https 访问,网站仍会重定向到:443

为了帮助调试,请在您的.htaccess 文件中尝试以下操作,然后访问https://your-domain.com/。会发生什么?

RewriteEngine On

RewriteCond %{HTTPS} on
RewriteRule ^ - [F]

如果您看到 403 Forbidden 响应,那么您的 Web 应用程序似乎正在触发此重定向。如果没有并且您仍然被重定向,那么主服务器配置/虚拟主机中的某些内容似乎会触发重定向。

EDIT#2:是的,我浏览 https 时的响应是 403 Forbidden。

这似乎表明您的 Web 应用程序正在触发此重定向。

这似乎得到了进一步的支持,因为您似乎只在请求 有效 URL 时才获得这种格式错误的重定向,即。一个只有应用程序知道的。例如,https://example.com/contact(有效页面)重定向到 http://example.com:443/contact(错误),但 https://example.com/does-not-exist 不重定向(您收到应用程序错误/404)。

【讨论】:

  • 鉴于上述指令,这似乎是不可能的? (当请求 HTTPS + 443 时,浏览器 也会省略协议)重定向的 URL 是使用http 还是https 协议?请求的 URL 是什么?我已经更新了我的答案。
  • 我尝试了你所有的建议,但没有任何效果,奇怪的是我不明白为什么会发生。如果我在不更改域名 example.com 的情况下提出您的最后建议,则重定向工作正常,但是当我用正确的域名替换它时,我再次收到 domainname.com:443
  • 澄清一下... 上述规范重定向应该靠近.htaccess 文件的顶部(当然 现有的 mod_rewrite 指令之前)。但是,这不应该导致您看到的重定向。对https://your-domain.com/foo 的直接请求是否可以解决?
  • 我确实把它放在顶部的所有内容之上,并且每次都清除缓存。这是域,如果它提供更快的测试tiny-mighty.com。我不知道这里的规则是否可以。并感谢您的支持。
  • 请求https://tiny-mighty.com/ 直接触发302 重定向回http://tiny-mighty.com:443/(注意HTTP)——这与上面的重定向没有任何关系。您是否确保 SSL 证书已正确安装在服务器上? SSL 证书是如何管理的? https://tiny-mighty.com/ 在尝试实施此重定向之前是否可以访问?
猜你喜欢
  • 2014-10-01
  • 1970-01-01
  • 2012-12-11
  • 1970-01-01
  • 1970-01-01
  • 2015-02-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多