.htaccess不在子目录中执行?

yhuiod9q  于 2022-11-16  发布在  其他
关注(0)|答案(1)|浏览(151)

我正在尝试实现以下重定向:
http://localhost/api/user/list?limit=10http://localhost/api/index.php/user/list?limit=10
根据https://htaccess.madewithlove.com/,我的.htaccess文件工作正常,但是当我测试它时,我得到一个404未找到错误。
"我所尝试的"
在我的.htaccess文件中,我包含了一个设置头的规则。这样,我就可以向 Postman 检查该规则是否已经执行。
当我向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"
t40tm48m

t40tm48m1#

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的直接请求,并进行相应的处理(甚至可能拒绝请求)。
在我的.htaccess文件中,我包含了一个设置头的规则。这样,我就可以向 Postman 检查该规则是否已经执行。
这并不一定告诉你RewriteRule指令是否被成功处理。不同的Apache模块是完全独立的,并且在请求过程中的不同时间被处理。如果没有设置头,那么这仅仅意味着Header指令没有被成功处理(可能是由于错误)。
http://localhost/api发送GET请求时
由于/api是一个物理子目录,如果您请求/api时没有使用尾随斜杠,则mod_dir最终应该301将请求重定向到/api/(附加尾随斜杠)。您的测试头不应该在重定向响应上设置(因为您没有在Header指令上使用always条件)。
根据htaccess.madewithlove.com,我的.htaccess文件工作正常
MWL测试器只模拟重写引擎的一次传递,因此无法检测重写/重定向循环。在真实的服务器上,重写引擎会一直循环,直到URL未更改地传递或遇到END标志(Apache 2.4)。(L标志只是停止重写引擎的当前传递,触发重写引擎开始另一次传递。)
在上面的规则中,您可以使用END标志(而不是L),它将否定对前面的 condition 的需要。

相关问题