我正在尝试将动态页面重定向到目录,例如:
url.com/index.php?page=download
to
url.com/download
规则很简单:
RewriteRule ^download$ /index.php?page=download
FULL .HTACCESS
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
问题是我已经有一个名为“download”的目录,并且它返回了“403 Forbidden Error”。 我注意到将目录重命名为与规则所使用的名称(下载)不同的任何内容都可以。
所以,我的问题是:如何以我需要的方式重写我的网址并保留目录?
- 编辑 -
默认情况下,我的服务器使用“403 Forbbiden错误”保护每个目录。我相信这就是为什么它不起作用的原因,但我不确定。 这确实是一场冲突吗? 发生了什么事?
答案 0 :(得分:1)
/download/?page=download
发生这种情况的原因是因为某处mod_dir重定向所有缺少尾部斜杠的目录的请求以包含尾部斜杠。这会干扰您的重写规则。由于您的服务器自动设置为拒绝列出目录,因此可以安全地继续关闭目录斜杠:
DirectorySlash Off
答案 1 :(得分: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标志会破坏链并返回,这会导致您的下载/文件夹显示为实际下载文件夹的列表,这是403错误的来源。
删除L标志以获取要处理的下一个规则:
RewriteRule ^download$ /index.php?page=download
这本身就没问题。