1

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

url.com/index.php?page=download
to
url.com/download

规则很简单:

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

完整的.HT访问

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 禁止错误”保护每个目录。我相信这是它不起作用的原因,但我不确定。真的是冲突吗?怎么了?

4

2 回答 2

1
/download/?page=download

发生这种情况的原因是因为 mod_dir 在某处重定向了对缺少尾部斜杠的目录的所有请求以包含尾部斜杠。这干扰了您的重写规则。由于您的服务器已自动设置为拒绝列出目录,因此继续关闭目录斜杠可能是安全的:

DirectorySlash Off

回答:https ://stackoverflow.com/users/851273/jon-lin

于 2013-05-03T02:21:29.960 回答
0

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

 RewriteRule .* - [L]

Apache 将逐行详细读取您的 htaccess,并尝试依次映射每个重写规则(显然是 + 条件)。让我们详细关注它。

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

这两个本身并不好,但不是问题的根源。如果 HTTP HOST 不是 www.url.com,它将重定向到http://url.com/ ...不是 www.url.com,然后将重定向到 url.com。您有一个潜在的无限循环,但前提是 HTTP HOST 不是 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 标志会破坏链并返回,这会导致您的 download/ 文件夹显示为您的实际下载文件夹的列表,这是您的 403 错误的来源。

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

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

这本身就很好。

于 2013-05-02T20:42:09.720 回答