1

我对 .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 参数,并且根据该参数,从数据库中提取不同的内容并将该页面显示在站点上。

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

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

诚然,这里的部分问题是缺乏远见。URL 重写应该在其他所有东西放在一起之前就已经计划好了,但是直到网站基本完成,我才被通知客户想要不包含该?p=部分的“友好 URL”。无论如何,也许有办法解决这个问题。

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

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

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

4

2 回答 2

3

这是mod_rewrite文档中的注释:

默认情况下,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]

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

于 2013-01-19T12:50:43.467 回答
0

更改以下代码行:

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

RewriteRule ^(podcast([^?]*)) index.php?p=$1 [L,NC]
于 2013-01-19T07:54:25.103 回答