0

我正在构建一个 ajax 驱动的网站,该网站使用 html5 pushState() 来保留其 url 结构并促进可靠的页面重新加载等。为此,我设置了我的 htaccess,以使任何以大写字母开头的目录路径并且没有尾部斜杠被重定向到一些

“domain.com/index.php?page=目录路径”

所以现在我的请求被翻译为:

domain.com/文件夹 => domain.com/index.php?page=文件夹

domain.com/Folder/ , domain.com/folder, domain.com/folder/ => (默认,不重写)

这是由我的 .htaccess 文件(位于域根目录)完成的,代码如下:

# Enable Rewriting
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_URI} ^((/?[A-Z][A-Za-z0-9]*)+[^/])$
RewriteRule ^((/?[A-Z][A-Za-z0-9]*)+[^/])$ index.php?page=$1

在我添加一个名为“Folder”的空白目录并在我的浏览器上访问“domain.com/Folder”之前,这一直很好。
以前,“domain.com/Folder”给了我预期的内容(“domain.com/index.php?page=Folder”)和“domain.com/Folder/”给了我一个 404 错误,正如预期的那样在文档根目录中没有名为“文件夹”的目录。

现在我的预期结果是:
浏览器在 url 栏中显示“domain.com/Folder”,服务器提供“domain.com/index.php?page=Folder”的内容(与“Folder”不存在的情况相同) )

但相反:
浏览器显示“domain.com/Folder?page=Folder”

有人可以指出我在这里做错了什么吗?而且,如果可能的话,我该如何纠正它?

*我在任何其他目录中都没有其他 htaccess 文件。
编辑:当我强制永久重定向 [R=301] 时,该方案似乎工作正常,但不幸的是,这会更改浏览器地址栏中的 url。

4

2 回答 2

1

最后,我想通了!
头痛是由 apache 内置的DirectorySlash配置引起的,如果目录存在,它会默默地添加尾部斜杠。
所以我通过关闭它来修复它。但是当我仔细考虑它时,我觉得它实际上是一个有用的重定向,所以我硬编码我的 htaccess 来为所有其他不以大写字母开头的目录添加斜杠

所以这是我最终的 htaccess 文件:

RewriteEngine On
DirectorySlash Off
RewriteBase /
RewriteCond %{REQUEST_URI} ^((/?[A-Z][A-Za-z0-9]*)+[^/])$ 
RewriteRule ^((/?[A-Z][A-Za-z0-9]*)+[^/])$ index.php?page=$1 [L]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^([a-z0-9][A-Za-z0-9/]*[^/])$ $1/ [R,L]

希望这可以帮助其他有类似问题的人

于 2012-10-27T11:43:43.167 回答
0

您缺少将忽略系统上不存在的文件或文件夹的指令。尝试在规则集的开头添加它:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

希望这可以帮助!

于 2012-10-26T07:57:55.423 回答