【问题标题】:Forcing http to https in htaccess, always redirect to homepage在htaccess中强制http到https,总是重定向到主页
【发布时间】:2017-06-12 09:20:06
【问题描述】:

我无法将http://example.com/test 重定向到https://example.com/test。它总是会重定向到主页。我在谷歌上搜索了几个小时,没有任何解决方案。下面是我的.htaccess

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteRule ^ - [E=protossl]
  RewriteCond %{HTTPS} on
  RewriteRule ^ - [E=protossl:s]
  RewriteRule ^ - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
  RewriteRule "(^|/)\." - [F]
  RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
  RewriteRule ^ http%{ENV:protossl}://%1%{REQUEST_URI} [L,R=301]
  RewriteBase /
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_URI} !=/favicon.ico
  RewriteRule ^ index.php [L]
  <IfModule mod_headers.c>
    RewriteCond %{HTTP:Accept-encoding} gzip
    RewriteCond %{REQUEST_FILENAME}\.gz -s
    RewriteRule ^(.*)\.css $1\.css\.gz [QSA]
    RewriteCond %{HTTP:Accept-encoding} gzip
    RewriteCond %{REQUEST_FILENAME}\.gz -s
    RewriteRule ^(.*)\.js $1\.js\.gz [QSA]
    RewriteRule \.css\.gz$ - [T=text/css,E=no-gzip:1]
    RewriteRule \.js\.gz$ - [T=text/javascript,E=no-gzip:1]

    <FilesMatch "(\.js\.gz|\.css\.gz)$">
      Header set Content-Encoding gzip
      Header append Vary Accept-Encoding
    </FilesMatch>
  </IfModule>
  RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
  RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
  RewriteCond %{HTTPS} !on
  RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
</IfModule>

<IfModule mod_headers.c>
  Header always set X-Content-Type-Options nosniff
</IfModule>

通过注释掉,我确实设法实现了我想要的:

# RewriteCond %{REQUEST_FILENAME} !-f
# RewriteCond %{REQUEST_FILENAME} !-d
# RewriteCond %{REQUEST_URI} !=/favicon.ico
# RewriteRule ^ index.php [L]

但这会给我的网站带来另一个问题。我收到 404 错误,当我访问后端系统时它会破坏我的网站。谁能指出我正确的方向?

【问题讨论】:

    标签: php apache .htaccess mod-rewrite drupal-7


    【解决方案1】:
    RewriteCond %{HTTPS} !on
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
    

    您的 HTTP 到 HTTPS 重定向位于错误的位置。这应该在文件的开头,而不是结尾。通过将此重定向放在前端控制器(您注释掉的代码位)之后,它确实会触发重定向到index.php

    此外,这应该是永久 (301) 重定向(一旦您确认它工作正常)。您还需要L 标志,如果您使用REQUEST_URI 服务器变量,则无需捕获RewriteRule 模式。所以,这应该写成如下:

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

    更新:

    RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
    RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
    RewriteCond %{HTTPS} !on
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
    

    事实上,这两个指令都应该放在文件的开头。第一个RewriteRule 应该重定向到https,而不是http,否则你会得到一个额外的(不必要的)重定向。

    【讨论】:

    • 它没有将站点重定向到 https。现在所有的 css、js 和 img 都无法加载,状态为 404。
    • 失败的 CSS、JS 和图像表示客户端 HTML 中的相对 URL。但是,如果在您注释掉 front controller 之前它重定向了,没有明显的理由为什么它不会重定向? SSL是如何管理的?我已经更新了我的答案 - 请注意,您的规范 www 到非 www 重定向也应该放在文件的开头。将更新后的.htaccess 文件发布到您的问题中。
    • 我设法通过使用另一个drupal模块(seckit)解决了这个问题。感谢您的帮助。
    猜你喜欢
    • 2012-10-20
    • 2016-11-14
    • 2020-05-28
    • 1970-01-01
    • 2012-02-28
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    • 1970-01-01
    相关资源
    最近更新 更多