.htaccess RewriteRule不从真实文件夹重定向

时间:2013-01-19 07:39:41

标签: .htaccess mod-rewrite url-rewriting rewrite

我对.htaccess的工作仍然有点模糊,我环顾四周,但找不到任何可以解决这个具体问题的事情。

编辑:我意识到还有其他问题似乎涵盖了这个问题,但我检查了一些,他们似乎没有提供任何我能理解的帮助,我不想用我自己的问题劫持他们

这就是我所拥有的:

Options +FollowSymLinks
#RewriteBase /
RewriteEngine on
RewriteRule /mp3/(.*) http://old.domain.com/mp3/$1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]*)$ /index.php?p=$1 [L]

从最后一行可以看出,在服务器名称之后键入的字符串实际上是一个URL参数,并且根据该参数,从数据库中提取不同的内容,并在网站上显示该页面。

我遇到的问题是客户端有一个名为“podcast”的内容页面,因此他们会转到site.com/podcast,它应该安静地重定向到site.com/index.php?=podcast并加载该页面的内容。不幸的是,客户端的服务器上还有一个真正的site.com/podcast/文件夹。因此,重写被忽略,浏览器尝试加载该文件夹。如果我禁用列表,它会显示文件列表或禁止的错误。

经过一些研究(我还是htaccess的新手),我了解到如果路径指向实际的文件或文件夹,那么前两行会禁用重写。不幸的是,用!-d注释掉那个似乎没有任何效果,并且注释掉两者都会给我一个服务器错误。

不可否认,这里的部分问题是缺乏远见。 URL重写应该在其他所有内容组合之前进行规划,但直到该网站基本完成后才通知我,客户端希望“友好URL”不包含?p=部分。无论如何,也许有办法解决这个问题。

是否有一些我可以使用的.htaccess技巧即使输入的URL指向实际存在的文件夹(不是特定文件),也会强制重写?如前所述,删除!-d似乎没有帮助,虽然我不知道为什么。也许我误解了它的目的。

感谢您的帮助,如果我忽视了一些显而易见的事情,请对我保持宽容。这是一个现在在客户端的现场网站上出现的问题,所以我觉得有点匆忙解决它。再次感谢。

OH YEAH,解决方案不能具体到/podcast。设置客户端网站的方式,当他们想要为网站创建新的子页面时,会根据页面的标题为该内容保存一个新名称,并且可能(不太可能,但仍然可能)另一个页面可以使用与服务器上现有文件夹匹配的名称创建。

2 个答案:

答案 0 :(得分:3)

以下是来自mod_rewrite documentation的说明:

  

默认情况下,mod_rewrite将忽略映射到目录的URL   磁盘但缺少尾部斜杠,期望是mod_dir   模块将向客户端发送重定向到规范URL   一个尾随斜线。

这解释了为什么mod_rewrite忽略了URL /podcast。我建议您重命名物理目录,以便不会(意外地)匹配文章名称。

另一种选择是禁用DirectorySlash设置。这将阻止Apache将/podcast重定向到/podcast/

DirectorySlash Off
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]*)$ /index.php?p=$1 [L]

请注意,禁用此设置会产生副作用。首先阅读文档。

答案 1 :(得分:0)

更改以下代码行:

RewriteRule ^([^/]*)$ /index.php?p=$1 [L]

RewriteRule ^(podcast([^?]*)) index.php?p=$1 [L,NC]