【问题标题】:.htaccess does not execute in subdirectories?.htaccess 不在子目录中执行?
【发布时间】:2022-11-14 03:54:05
【问题描述】:

我正在尝试实现以下重定向:

http://localhost/api/user/list?limit=10http://localhost/api/index.php/user/list?limit=10

根据https://htaccess.madewithlove.com/,我的 .htaccess 文件工作正常,但是当我测试它时,我收到 404 Not Found 错误。

我试过的

在我的 .htaccess 文件中,我包含了一个设置标题的规则。这样,我可以与邮递员检查规则是否已执行。

当我向http://localhost/api 发送 GET 请求时,我在响应中看到了我的“TEST_FOOBAR”标头。但是,当我向http://localhost/api/user 发送 GET 请求时,标头不再存在。

但是,当我向http://localhost/api/inc(现有文件夹)发送请求时,我确实可以看到我的标题。

这让我相信我的 .htaccess 只监听和重写发送到http://localhost/api 的请求,而不是它的“虚拟的”子文件夹。

我在谷歌上搜索了一段时间,但似乎无法弄清楚为什么它不重写对“虚拟的”子目录?

这是我的 .htaccess 文件:

RewriteEngine On
RewriteRule ^api(.*)$ /api/index.php$1
Header set TEST_FOOBAR "oi"

【问题讨论】:

    标签: .htaccess http get


    【解决方案1】:
    RewriteRule ^api(.*)$ /api/index.php$1
    

    就其本身而言,这看起来会导致重写循环,因为目标 URL /api/index.php... 也与 RewriteRule 匹配图案^api(.*)$,因此对/api/user 的请求将被重写如下:

    1. /api/user/api/index.php/user
    2. /api/index.php/user/api/index.php/index.php/user

      请尝试以下操作,以防止重写的请求被进一步重写:

      RewriteCond %{ENV:REDIRECT_STATUS} ^$
      RewriteRule ^api(/.*)$ /api/index.php$1 [L]
      

      api 之后必须始终有一个斜线(为了使替换有效),所以我将它包含在捕获组中。

      REDIRECT_STATUS env var 的检查确保只处理初始请求而不是重写请求。我使用了这种方法,而不是显式检查/api/index.php,因为它允许您的API 处理对/api/index.php 的直接请求并进行相应处理(甚至可能拒绝请求)。

    【讨论】:

      猜你喜欢
      • 2013-02-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 2011-10-13
      • 2011-02-21
      • 1970-01-01
      相关资源
      最近更新 更多