在htaccess中强制http到https,始终重定向到主页

时间:2017-06-12 09:20:07

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

我无法将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错误,当我访问后端系统时它会破坏我的网站。有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:0)

RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

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

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

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,否则您将获得额外的(不必要的)重定向。