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

Apache 与重定向到index.php和文件夹冲突,apache,.htaccess,redirect,Apache,.htaccess,Redirect,我租了一台ApacheWeb服务器。文件夹体系结构如下所示: 根 src 模板 少 万维网 css js jpeg web服务器仅为www目录提供服务。我使用.htaccess重定向到HTTPS,删除www.并将所有请求重定向到index.php,除非www文件夹中存在文件 重新编写引擎打开 #重定向到HTTPS 重写条件%{HTTPS}关闭 重写规则(.*)https://%{HTTP_HOST}%{REQUEST_URI}[R=301,L] #删除WWW 重写COND%{HTTP

我租了一台ApacheWeb服务器。文件夹体系结构如下所示:

    • src
    • 模板
    • 万维网
      • css
      • js
      • jpeg
web服务器仅为
www
目录提供服务。我使用.htaccess重定向到HTTPS,删除
www.
并将所有请求重定向到
index.php
,除非
www
文件夹中存在文件

重新编写引擎打开
#重定向到HTTPS
重写条件%{HTTPS}关闭
重写规则(.*)https://%{HTTP_HOST}%{REQUEST_URI}[R=301,L]
#删除WWW
重写COND%{HTTP_HOST}^www\.domaine\.com$[NC]
重写规则(.*)https://domaine.com%{REQUEST_URI}[R=301,QSA,NC,L]
#将所有路由重定向到index.php
#除了文件
重写cond%{REQUEST_FILENAME}-F
重写规则(.*)/index.php?$1/[NC,L,QSA]
问题是当我请求一个文件夹名时。文件夹被重定向两次到
index.php

示例:当我请求
http://domaine.com/css
,请求被重定向到
https://domaine.com/index.php?css/?css/


如何解决双重重定向问题?

您需要从上一条规则中排除目录,或者使用重定向规则向目录添加一个尾随斜杠,以避免这种行为

否则,最后一条规则将不带斜杠的目录重写为
/index.php
,并且由于缺少斜杠
mod_dir
模块通过附加一个尾部斜杠重定向

您还应该将
www
规则移动到
http->https
规则之前的
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]

选项-多视图
选项-索引
重新启动发动机
#删除WWW并使用https
重写COND%{HTTP_HOST}^www\(域名\.com)$[NC]
重写规则^https://%1%{REQUEST_URI}[R=301,NE,L]
#重定向到HTTPS
重写条件%{HTTPS}关闭
重写规则^https://%{HTTP_HOST}%{REQUEST_URI}[R=301,L,NE]
#为目录添加尾部斜杠
RewriteCond%{REQUEST_FILENAME}-d
重写规则[^/]$%{REQUEST_URI}/[L,R=301]
#将所有路由重定向到index.php
#除了文件
重写cond%{REQUEST_FILENAME}-F
重写规则。*index.php?$0/[NC、L、QSA]

在测试此更改之前,请确保清除浏览器缓存。

我已解决问题。我使用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]

选项-多视图
选项-索引
目录删除
重新启动发动机
#删除WWW并使用https
重写COND%{HTTP_HOST}^www\(域名\.com)$[NC]
重写规则^https://%1%{REQUEST_URI}[R=301,NE,L]
#重定向到HTTPS
重写条件%{HTTPS}关闭
重写规则^https://%{HTTP_HOST}%{REQUEST_URI}[R=301,L,NE]
重写cond%{REQUEST_FILENAME}-F
重写规则。*/index.php?$0[NC,L,QSA]

尝试清除浏览器缓存。我不想允许访问者访问我的子目录。只有文件
子目录
的内容不会与这些规则一起列出,并且
目录删除
存在安全风险。请在Apache手册中阅读。有更好的方法来处理这个问题。我阅读了Apache文档并禁用了索引选项以避免安全风险。即使我的服务器没有。因为我将所有不是文件的路由重定向到我的index.php,所以我最终使用您的解决方案。目录被重定向到index.php,末尾有2个斜杠,但这个问题与此无关。