首页 > 解决方案 > 从节点获取时 index.php 无法识别路由

问题描述

我在 Nodejs 中为支付网关构建了一种代理,以连接我在 PHP 中的应用程序。

我现在正尝试使用 GET 请求从我的节点服务器访问我的 PHP 应用程序中的一个端点,但我不断收到相同的错误“重定向太多”。

搜索谷歌我发现这是错误通常与我的 .htaccess 文件中的重写模块有关,这可能会无休止地重定向我的路线,永远不会脱离重写条件。

看看我的 .htaccess 文件,它看起来很样板,我不知道是什么导致了这个无限重定向循环。

<IfModule mod_rewrite.c>
  RewriteEngine On
  # !IMPORTANT! Set your RewriteBase here and don't forget trailing and leading
  #  slashes. If your page resides at http://www.example.com/mypage/test1 then use RewriteBase /mypage/test1/
  RewriteBase /
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ^(.*)$ index.php?/$1 [L]
</IfModule>
<IfModule !mod_rewrite.c>
  # If we don't have mod_rewrite installed, all 404's can be sent to index.php, and everything works as normal.
  # Submitted by: ElliotHaughin
  ErrorDocument 404 /index.php
</IfModule>

最奇怪的是,如果我使用 Postman 或浏览器尝试完全相同的路线,一切正常!控制器被击中,我得到了回应。

此外,在进一步的研究中,我设法将请求对象记录在我的 index.php 文件中,以获取来自 Postman 的工作请求和来自我的 nodejs 服务器的失败请求。除了描述 URL 的字段外,它们在几乎所有字段中看起来都差不多。在成功请求中,我得到以下字段:

   // this is logged once
   [REDIRECT_QUERY_STRING] => /notifica
   [REDIRECT_URL] => /notifica
   [QUERY_STRING] => /notifica
   [REQUEST_URI] => /notifica

但是当从 nodejs 获取时,这些是我得到的字段:

   // this is logged many times until I reach my redirect limit
   // [REDIRECT_QUERY_STRING] doesn't exist
   // [REDIRECT_URL] doesn't exist
   [QUERY_STRING] =>
   [REQUEST_URI] => /

有谁知道可能导致这种行为的原因是什么?为什么来自 Postman 和浏览器的请求可以工作,而不是来自 Nodejs 中的应用程序?也许我在两个程序默认添加的标题中遗漏了一些东西,但我用来发出请求的模块没有?

标签: phpnode.jsapache.htaccessmod-rewrite

解决方案


您的主要规则始终匹配所有内容并始终修改 URL。了解该L标志只是停止在当前迭代中寻找更多匹配规则,并使用重写的 URL 再次循环。请参阅重写实际作用的说明图。在像您这样的简单情况下,使用END标志就足够了,否则您的规则必须既匹配初始请求,又不匹配重写的 URL。

PS:不要对任何进行更改的东西使用 GET 请求,这就是 POST 等的用途。

PPS 你不需要添加查询字符串的路径,PHP 应该可以看到请求$_SERVER['REQUEST_URI']


推荐阅读