与重定向到index.php和文件夹冲突

时间:2017-06-01 09:31:52

标签: apache .htaccess redirect

我租用了一个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/

如何解决双重定向?

2 个答案:

答案 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]