当文件夹存在时,mod_rewrite忽略规则

时间:2013-10-25 09:57:10

标签: apache .htaccess mod-rewrite

我进行了搜索和搜索,无法在任何地方找到此问题。

我们的设置并不理想,这与API有关。

/.htaccess文件

RewriteEngine On
RewriteBase /
RewriteRule ^api$ /system/api.php [L,NC]

/api/2/.htaccess文件

RewriteEngine On
RewriteBase /api/2/
RewriteRule ^ index.php [QSA,L]

文件夹结构

/
    /.htaccess
    /api
        /2
            /index.php <--- My API 2 file
            /.htaccess
    /system
        /api.php

问题

我需要用户能够在/ api或/ api /上访问旧API,直到我们的新API准备就绪。

我需要用户能够在/ api / 2 /上访问新的API。

.htaccess,mod_rewrite忽略/ api $规则上的$(字符串结尾)。那里没有规则可以忽略目录,为什么要这样做?

应该发生什么 - 至少我想要发生什么

对/ api的请求?URLParam = Hello - 应该导致请求被路由到/system/api.php

对/ api / 2的请求?URLParam = Hello - 应该导致请求转到/api/2/index.php

究竟发生了什么

请求/ api?URLParam = Hello - 这些返回301重定向到请求/ api /(注意斜杠) - 这通常不是问题,但我们有很多jQuery POST调用/ api(没有斜杠)。重定向后,POST数据将丢失,导致对/ api /

的API调用失败

对/ api / 2的请求?URLParam = Hello - 工作正常。

我尝试了什么

  • 您可以看到基本的htaccess文件。
  • 忽略/ api和/ api /
  • 规则的排序
  • -f -d标志两者!没有逆变器。

临时修复

当我删除/ api /目录时,对/ api?Param = Hello的调用完全没有任何问题,没有301重定向。但显然这会停止/ api / 2 /来电。

我无法弄清楚 - 任何帮助都会非常感激。

谢谢,

约什

1 个答案:

答案 0 :(得分:2)

使用DirectorySlash Off关闭尾部斜杠,并在root .htaccess中添加可选的尾部斜杠:

/ .htaccess文件

DirectorySlash Off

RewriteEngine On
RewriteBase /
RewriteRule ^api/?$ /system/api.php [L,NC]