Apache 通过.htaccess重定向不起作用

Apache 通过.htaccess重定向不起作用,apache,.htaccess,Apache,.htaccess,我正在使用安装了LAMP的Ubuntu 19.10。 .htaccess存储在/EX/clean\u url/handp/文件夹中的文件- RewriteEngine on Options -Indexes Redirect /EX/clean_url/handp/access_denied.php 因此,我不想显示handp的文件夹结构 当我试图在Google Chrome中查看handp的文件夹结构时,它会重定向回access\u denied.php页面(这很好),但它不会显示acces

我正在使用安装了LAMP的Ubuntu 19.10。
.htaccess存储在
/EX/clean\u url/handp/
文件夹中的文件-

RewriteEngine on
Options -Indexes
Redirect /EX/clean_url/handp/access_denied.php
因此,我不想显示
handp
的文件夹结构
当我试图在Google Chrome中查看
handp
的文件夹结构时,它会重定向回
access\u denied.php
页面(这很好),但它不会显示
access\u denied.php
页面的内容,因为Google Chrome'给了我错误信息

此页面不工作
localhost重定向您的次数太多。
尝试清除您的cookies。
错误\u太多\u重定向


我也无法查看
handp
文件夹中的文件内容,如
form.php
等。它正在重定向回
access\u denied.php
页面,并出现与上述相同的Google Chrome错误。

您正在重定向任何访问
handp
文件夹的尝试。这包括有效的尝试和
访问\u denied.php
。因此,您会收到错误“重定向您太多次”。它会将您重定向到该文件,但由于该文件位于该文件夹内,它只会触发另一个重定向,从而导致无限循环

请尝试以下方法:

RewriteEngine On 
# If requested filename is not an existing file
RewriteCond %{REQUEST_FILENAME} !-f
# If requested filename is not an existing directory
RewriteCond %{REQUEST_FILENAME} !-d 
# Rewrite the url
RewriteRule ^([^/]+)/?$ https://your_domain.com/handp/access_denied.php [R,L]
只有当有人试图访问
handp
中不存在的文件或文件夹时,才应该重定向

我只是不想显示handp的文件夹结构,就像有人在浏览器中给出该文件夹的路径以查看其中的内容一样

如果您只是想阻止从mod_autoindex生成自动生成的目录结构,那么您只需要:

Options -Indexes
(这是您已经拥有的。)

这将导致直接请求目录的任何用户的403禁止响应

如果要返回自定义403响应,请配置一个
ErrorDocument
——您不应该从外部重定向(3xx响应)到看似错误的文档

例如:

ErrorDocument 403 /EX/clean_url/handp/access_denied.php
RedirectMatch ^(/EX/clean_url/handp/)$ $1access_denied.php
RewriteEngine On
RewriteRule ^$ access_denied.php [L]

更新:为什么我给出了相对路径,比如
/access\u denied.php

ErrorDocument
指令要求文档根相对URL路径,以斜杠开头。不支持相对路径。如果指定一个相对路径,如
/access\u denied.php
(或
access\u denied.php
),则它将被视为文字文本,并只输出字符串“/access\u denied.php”

为什么重定向在my
.htaccess中不起作用
.htaccess存储在
/EX/clean\u url/handp/
文件夹中的文件-
Redirect/EX/clean\u url/handp/access\u denied.php

此指令将
/EX/clean\u url/handp/
重定向到
/EX/clean\u url/handp/access\u denied.php
,它还将捕获重定向到
access\u denied.php的请求,并重复重定向到自身,创建重定向循环,直到浏览器最终因错误而中断(大约20次重定向后)

您需要做的只是重定向
/EX/clean\u url/handp/
。您不能使用
redirect
,因为它使用简单的前缀匹配。但是,您可以使用使用regex匹配的
RedirectMatch
指令。(但请注意,这会自然地向客户端返回3xx响应,而不是所需的403禁止响应,并公开您的
access\u denied.php
脚本。当请求
access\u denied.php
时,随后会出现200 OK响应,除非您覆盖
access\u denied.php
脚本中的HTTP状态。)

(请注意,
Redirect
RedirectMatch
是mod_别名指令,因此不需要
RewriteEngine On
指令,这是mod_rewrite的一部分。)

例如:

ErrorDocument 403 /EX/clean_url/handp/access_denied.php
RedirectMatch ^(/EX/clean_url/handp/)$ $1access_denied.php
RewriteEngine On
RewriteRule ^$ access_denied.php [L]
URL路径在
$1
反向引用中捕获,并在目标URL中使用(保存重复)

或者,您可以使用mod_rewrite在内部重写请求(URL不会更改为expose
\u access\u denied.php,但您仍然需要确保从脚本返回适当的4xx HTTP状态代码)。例如:

ErrorDocument 403 /EX/clean_url/handp/access_denied.php
RedirectMatch ^(/EX/clean_url/handp/)$ $1access_denied.php
RewriteEngine On
RewriteRule ^$ access_denied.php [L]
或者,您可以简单地更改此(及后续)目录的
DirectoryIndex

DirectoryIndex /EX/clean_url/handp/access_denied.php
如果没有
/EX/clean\u url/handp/
的子目录,可以删除url路径:

DirectoryIndex access_denied.php

(同样,您需要从脚本手动发送4xx状态代码。)

我只是不想显示
handp的文件夹结构,就像有人在浏览器中给出该文件夹的路径以查看其中的内容一样。@Abhishekkamal就是这样做的。如果你浏览文件夹,你的服务器会自动尝试提供索引文件。比如
index.html
index.php
(取决于服务器设置)。如果这样的文件不存在,它将返回文件夹结构或404错误(同样,取决于设置)。如果访问者试图获取任何不存在的内容,此htaccess将重定向。但是您也可以创建一个
index.html
文件,该文件重定向到您的拒绝访问文件,并对其进行处理。谢谢,它起到了作用……但是,当我给出类似
/access\u denied.php
的相对路径时,它为什么不起作用?您能告诉我为什么
重定向
在my.htaccess中不起作用。我已更新了我的答案,解决了您评论中的问题,以及一些备选方案。