htaccess mod_rewrite重定向目录路径,没有到PHP GET的尾部斜杠

时间:2012-10-26 07:15:53

标签: apache .htaccess mod-rewrite get trailing-slash

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

“domain.com/index.php?page=Directorypath”

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

domain.com/Folder => domain.com/index.php?page=Folder

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错误,正如预期的那样在文档根目录中没有名为“Folder”的目录。

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

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

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

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

2 个答案:

答案 0 :(得分:1)

最后,我想出来了! 头疼是由内置 DirectorySlash 配置的apache引起的,如果目录存在,它会静默添加尾部斜杠。
所以我通过将其关闭来修复它。但是当我想到它时,我觉得它实际上是一个有用的重定向,所以我将我的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]

希望这可以帮助其他有类似麻烦的人

答案 1 :(得分:0)

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

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

希望这有帮助!