我对 .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
. 客户站点的设置方式,当他们想要为站点创建新的子页面时,会根据页面标题为该内容保存一个新名称,并且可能(不太可能,但仍然可能)另一个页面可以使用与服务器上现有文件夹匹配的名称创建。