2017-06-12 150 views
1

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

<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错误,并导致我的网站中断。任何人都可以指出我正确的方向吗?

回答

0
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] 

UPDATE:

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

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

+0

它没有将网站重定向到https。现在,所有css,js和img都无法加载状态404. –

+0

失败的CSS,JS和图像表示客户端HTML中的相对URL。但是,没有明显的理由说明,如果在您将_front控制器_注释掉之前重定向了,它将不会重定向。 SSL如何管理?我已经更新了我的答案 - 请注意,您的非www重定向的规范www也应该在文件的开头。将您更新的'.htaccess'文件发布到您的问题。 – MrWhite

+0

我设法通过使用另一个drupal模块(seckit)来解决这个问题。谢谢你的帮助。 –

相关问题