我租用了一个Apache Web服务器。文件夹架构是这样的:
- 根
- SRC
- 模板
- 少
- WWW
- CSS
- JS
- JPEG
Web服务器仅提供www
目录。我使用.htaccess重定向到HTTPS,删除www.
并将所有请求重定向到index.php
,除非www
文件夹中存在文件。
RewriteEngine On
# Redirect to HTTPS
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# Remove WWW
RewriteCond %{HTTP_HOST} ^www\.domaine\.com$ [NC]
RewriteRule (.*) https://domaine.com%{REQUEST_URI} [R=301,QSA,NC,L]
# Redirect all route to index.php
# Except the files
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) /index.php?$1/ [NC,L,QSA]
问题是我何时请求文件夹名称。该文件夹被重定向两次到index.php
!
示例:当我请求http://domaine.com/css
时,请求会重定向到https://domaine.com/index.php?css/?css/
。
如何解决双重定向?
答案 0 :(得分:1)
您需要从上一个规则中排除目录,或者使用重定向规则将尾部斜杠添加到目录以避免此行为
否则,最后一条规则会将没有斜杠的目录重写为/index.php
,并且由于缺少斜杠mod_dir
模块重定向而附加一个斜杠。
另外,您应该在www
规则之前将http->https
规则移至避免多次301重定向,以获取http://www.domaine.com/
的请求。
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>
Options -Indexes
RewriteEngine On
# Remove WWW and use https
RewriteCond %{HTTP_HOST} ^www\.(domaine\.com)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [R=301,NE,L]
# Redirect to HTTPS
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L,NE]
# add trailing slash for directories
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule [^/]$ %{REQUEST_URI}/ [L,R=301]
# Redirect all route to index.php
# Except the files
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .* index.php?$0/ [NC,L,QSA]
确保在测试此更改之前清除浏览器缓存。
答案 1 :(得分:0)
我解决了我的问题。我使用DirectorySlash指令删除最后的自动斜杠。现在该工作和我的所有目录都被隐藏了。只有文件可见。
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>
Options -Indexes
DirectorySlash Off
RewriteEngine On
# Remove WWW and use https
RewriteCond %{HTTP_HOST} ^www\.(domaine\.com)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [R=301,NE,L]
# Redirect to HTTPS
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L,NE]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .* /index.php?$0 [NC,L,QSA]