Apache 通过.htaccess重定向不起作用
我正在使用安装了LAMP的Ubuntu 19.10。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
.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中不起作用。我已更新了我的答案,解决了您评论中的问题,以及一些备选方案。