Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 当目录存在时,使用htaccess重写url_Php_.htaccess_Url Rewriting - Fatal编程技术网

Php 当目录存在时,使用htaccess重写url

Php 当目录存在时,使用htaccess重写url,php,.htaccess,url-rewriting,Php,.htaccess,Url Rewriting,我正在尝试将动态页面重定向到目录,例如: url.com/index.php?page=download to url.com/download 规则很简单: RewriteRule ^download$ /index.php?page=download 完全访问 RewriteEngine On RewriteBase / RewriteCond %{HTTP_HOST} !^www\.url\.com$ RewriteRule ^(.*) http://url.com/$1 [R=30

我正在尝试将动态页面重定向到目录,例如:

url.com/index.php?page=download
to
url.com/download
规则很简单:

RewriteRule ^download$ /index.php?page=download
完全访问

RewriteEngine On
RewriteBase /

RewriteCond %{HTTP_HOST} !^www\.url\.com$
RewriteRule ^(.*) http://url.com/$1 [R=301,L]

Redirect 301 /index.php?page=download http://url.com/download
RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule .* - [L]
RewriteRule ^download$ /index.php?page=download
问题是,我已经有一个名为“下载”的目录,它返回给我一个“403禁止的错误”。 我注意到,将目录重命名为与规则使用的名称(下载)不同的名称将起作用

所以,我的问题是:我如何能让我的url重写的方式,我需要和保持目录

--编辑--

默认情况下,我的服务器使用“403 Forbbiden错误”保护每个目录。我相信这就是它不起作用的原因,但我不确定。 这真的是冲突吗?
发生了什么事?

我认为,您的问题是由于这个特定的重写规则:

 RewriteRule .* - [L]
Apache将逐行详细阅读您的htaccess,并尝试依次映射每个重写规则(+显然是条件)。让我们详细了解一下

 RewriteCond %{HTTP_HOST} !^www\.url\.com$
 RewriteRule ^(.*) http://url.com/$1 [R=301,L]
这两个问题本身并不好,但不是问题的根源。如果HTTP主机不是www.url.com,它将重定向到。。。它不是www.url.com,然后会重定向到url.com。您有一个潜在的无限循环,但前提是HTTP主机不是www.url.com。如果匹配,由于L标志,它将中断处理并返回重定向

Redirect 301 /index.php?page=download http://url.com/download
这条线很好。您正在对任何碰巧知道index.php?page=download的人执行301重定向

RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule .* - [L]
这条线不是很好。重写条件指定,到目前为止,任何不是来自上面的重定向的内容都适用于下一个规则。下一条规则匹配所有内容(.*表示所有内容。任何内容的0个或多个字符)和“重写到”-,在mod_rewrite语言中,这是一个“请勿触摸”标志。这很好。但是,L标志会断开链并返回,这会导致下载/文件夹显示为实际下载文件夹的列表,这是403错误的来源

删除L标志以获取下一个要处理的规则:

RewriteRule ^download$ /index.php?page=download

这本身很好。

我认为,您的问题是由于以下特定的重写规则:

 RewriteRule .* - [L]
/download/?page=download
Apache将逐行详细阅读您的htaccess,并尝试依次映射每个重写规则(+显然是条件)。让我们详细了解一下

 RewriteCond %{HTTP_HOST} !^www\.url\.com$
 RewriteRule ^(.*) http://url.com/$1 [R=301,L]
这两个问题本身并不好,但不是问题的根源。如果HTTP主机不是www.url.com,它将重定向到。。。它不是www.url.com,然后会重定向到url.com。您有一个潜在的无限循环,但前提是HTTP主机不是www.url.com。如果匹配,由于L标志,它将中断处理并返回重定向

Redirect 301 /index.php?page=download http://url.com/download
这条线很好。您正在对任何碰巧知道index.php?page=download的人执行301重定向

RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule .* - [L]
这条线不是很好。重写条件指定,到目前为止,任何不是来自上面的重定向的内容都适用于下一个规则。下一条规则匹配所有内容(.*表示所有内容。任何内容的0个或多个字符)和“重写到”-,在mod_rewrite语言中,这是一个“请勿触摸”标志。这很好。但是,L标志会断开链并返回,这会导致下载/文件夹显示为实际下载文件夹的列表,这是403错误的来源

删除L标志以获取下一个要处理的规则:

RewriteRule ^download$ /index.php?page=download
这本身就很好

/download/?page=download
之所以会发生这种情况,是因为mod_dir会在某个地方重定向对缺少尾部斜杠的目录的所有请求,以包含尾部斜杠。这违反了你的重写规则。由于您的服务器自动设置为拒绝目录列表,因此可能可以安全地继续并关闭目录斜杠:

DirectorySlash Off
答复如下:

之所以会发生这种情况,是因为mod_dir会在某个地方重定向对缺少尾部斜杠的目录的所有请求,以包含尾部斜杠。这违反了你的重写规则。由于您的服务器自动设置为拒绝目录列表,因此可能可以安全地继续并关闭目录斜杠:

DirectorySlash Off

回答:

这就是全部代码吗?即使该目录存在,也没有出现该错误的原因。@faa是的,这是所有相关代码。那么你是说它不应该发生吗?是的,目录甚至可以存在,但仍然应该使用规则。如果您用完整的代码更新您的问题,无论是否相关,都会更好。关于选项,是
options+FollowSymlinks-MultiViews
还是类似的?在我发布这个问题之前,我试图删除整个规则作为一个测试,但没有成功,所以我认为这不可能是这里的问题…只需再添加一个-如果我是对的,您得到403的原因是它试图列出/downloads/的内容。您是否有索引或index.php触发403?如果不是,你会因此得到403。这就是全部代码吗?即使该目录存在,也没有出现该错误的原因。@faa是的,这是所有相关代码。那么你是说它不应该发生吗?是的,目录甚至可以存在,但仍然应该使用规则。如果您用完整的代码更新您的问题,无论是否相关,都会更好。关于选项,是
options+FollowSymlinks-MultiViews
还是类似的?在我发布这个问题之前,我试图删除整个规则作为一个测试,但没有成功,所以我认为这不可能是这里的问题…只需再添加一个-如果我是对的,您得到403的原因是它试图列出/downloads/的内容。您是否有索引或index.php触发403?如果没有,你会因此得到403分。正如我之前在问题评论中回答的那样,在发布此问题之前,我已尝试删除所有以前的规则作为测试,但它不起作用。正如我之前在