PHP Web Service带与不带尾部斜杠访问数据接收异常如何解决
问题根因
你遇到的现象是Apache的mod_dir模块默认机制导致的:当访问路径对应存在的目录且未携带尾部斜杠时,Apache默认会返回301重定向到带尾部斜杠的同路径,重定向过程中POST请求会被自动转为GET请求,请求体JSON payload会直接丢失,因此php://input读取为空,返回无数据的提示。
可行解决方案
下面提供两种符合你要求的实现方案,二选一即可:
方案1:在/api/check/目录下添加.htaccess文件(推荐,无需修改业务代码)
选择以下任意一种配置规则写入.htaccess即可:
配置方式A:关闭目录自动补斜杠重定向,内部重写请求
直接取消目录自动补斜杠的外部重定向逻辑,所有请求内部映射到index.php处理,不会丢失请求体:
<IfModule mod_dir.c> DirectorySlash Off </IfModule> <IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^check$ index.php [L] </IfModule>
配置方式B:用307重定向保留请求信息
如果需要保留补斜杠的路径规范,可使用307重定向(307状态码会要求客户端保留原请求方法和请求体重新发起请求,主流HTTP客户端均支持该特性):
<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_METHOD} POST RewriteRule ^api/check$ /api/check/ [R=307,L] </IfModule>
方案2:修改文件适配(仅在无法修改.htaccess时使用)
如果服务器不允许自定义.htaccess规则,可在/api/目录下新建check.php文件,将你编写的业务代码完整复制到该文件中,同时保留/api/check/index.php的原有代码即可。这样不带斜杠的/api/check请求会直接匹配到api目录下的check.php文件,不会触发重定向丢失数据。
内容的提问来源于stack exchange,提问作者Giuseppe Lodi Rizzini
相关产品推荐
相关产品推荐

