当存在具有相同名称的目录时,htaccess重写all到index.php失败

时间:2014-01-29 23:51:18

标签: php .htaccess mod-rewrite

您好我正在尝试完成以下操作:

1)删除尾部斜杠

2)即使存在与url中名称相同的目录,也将每个请求重定向到root index.php。我们假设我有一个名为'users'的文件夹,我不希望'http://local.dev/users'将我重定向到该文件夹​​,而是通过php处理它,就像其他请求一样。

3)我希望能够访问任何类型的图像,js,css和其他一些特定的文件类型 即使它们在目录中。

到目前为止我所拥有的是:

RewriteEngine on
RewriteBase /
RewriteRule ^(.*)/$ $1 [R=301,L]
RewriteCond %{REQUEST_URI} !^.*\.(png|jpg|jpeg|bmp|gif|css|js|json|csv)$ [NC]
RewriteRule ^(.*)$ index.php?path=$1 [NC,L,QSA]

和用于测试案例的php:

<!DOCTYPE html>
<html>
    <head>
        <title>+dev</title>
    </head>
    <body>
        <?php
            echo $_SERVER['REQUEST_URI'] . '<br>';
            print_r($_GET);
            echo '<br>';
            include 'test/test.php';
        ?>
        <img src="/image.jpg">
        <img src="/test/image2.jpg">
    </body>
</html>

但是我注意到以下问题:

请记住,我在htaccess和index.php旁边的根目录中有一个名为test的文件夹

http://local.dev/test/image.jpg =工作

http://local.dev/somestring =工作

http://local.dev/someImage.jpg =工作

http://local.dev/test/ =失败

http://local.dev/test =失败

最后两种情况下的浏览器网址输出:

http://local.dev/test?path=test&path=test&path=test&path=test&path=test&path=test&path=test&path=test&path=test&path=test

Yeap重定向循环,但我无法弄清楚为什么因为我不熟悉mod_rewrite。我想要的是,无论是否存在具有相同名称的文件夹,最后2个失败的请求都被视为普通请求。虽然我希望如果它们的扩展名在“允许列表”上,则可以访问该文件夹中的文件。

2 个答案:

答案 0 :(得分:0)

更改为:

RewriteEngine on
RewriteBase /
RewriteRule ^(.*)/$ $1 [R=301,L]
RewriteRule !\.(png|jpg|jpeg|bmp|gif|css|js|json|csv)$ index.php [NC,L]

答案 1 :(得分:0)

发生这种情况的原因是mod_dir and the DirectorySlash directive。本质上,如果它看到没有尾部斜杠的URI,并且它映射到现有目录,那么它将重定向请求以使其具有尾部斜杠。由于mod_dir和mod_rewrite都位于URL文件处理管道中的不同位置,因此mod_dir和mod_rewrite都应用于同一URL。

所以你需要关闭DirectorySlash(可以将它放在你的htaccess文件中的任何地方):

DirectorySlash Off