php - redirect_status 的奇数 (44)

标签 php apache .htaccess mod-rewrite redirect

  1. $_SERVER['REDIRECT_STATUS'] 的值为 '44' 是什么意思?
  2. 为什么 $_SERVER['REDIRECT_URL'] 有一个 "/500.shtml" 值?
  3. 我没有使用 mod_rewrite 进行外部重定向,但是 $_SERVER 有两个不同的 REQUEST_METHOD 值(POST 和 GET);就像我发出一个 POST 请求然后被重定向为一个 GET 请求。这里发生了什么?

我使用了 http://blog.iosart.com/2004/05/26/fooling-apache/ 中描述的方法根据 %{HTTP_HOST} 值设置一些环境变量,然后在多个 PHP 应用程序之间进行多路复用。

当使用 multipart/form-data POST 请求寻找错误时,我发现 PHP 从 Superglobals 获取这些值:

$_SERVER=array
(
    'CONTENT_LENGTH' => '1660'
    'CONTENT_TYPE' => 'multipart/form-data; boundary=----------------------------7e789ef7ac774b7689c602d8f67446dd'
    'CONTEXT_DOCUMENT_ROOT' => '/home/myphpapp/public_html'
    'CONTEXT_PREFIX' => ''
    'DOCUMENT_ROOT' => '/home/myphpapp/public_html'
    'GATEWAY_INTERFACE' => 'CGI/1.1'
    'HTTP_ACCEPT' => '*/*'
    'HTTP_ACCEPT_ENCODING' => 'gzip, deflate'
    'HTTP_CONNECTION' => 'keep-alive'
    'HTTP_HOST' => 'api.myphpapp.com'
    'HTTP_USER_AGENT' => 'Dalvik/1.6.0 (Linux; U; Android 4.4.2; Android SDK built for x86 Build/KK)'
    'HTTP_X_TOKEN' => 'prod'
    'MY_HTTP_HOST' => 'api.myphpapp.com'
    'PATH' => '/bin:/usr/bin'
    'QUERY_STRING' => ''
    'REDIRECT_MY_HTTP_HOST' => 'api.myphpapp.com'
    'REDIRECT_REDIRECT_REQUEST_METHOD' => 'POST'
    'REDIRECT_REDIRECT_STATUS' => '44'
    'REDIRECT_REDIRECT_UNIQUE_ID' => 'UxZd4zIcVQUAAFwqGD8AAAAG'
    'REDIRECT_STATUS' => '44'
    'REDIRECT_UNIQUE_ID' => 'UxZd4zIcVQUAAFwqGD8AAAAG'
    'REDIRECT_URL' => '/500.shtml'
    'REDIRECT_APP_SET' => 'api'
    'REDIRECT_APP_MODE' => 'production'
    'REMOTE_ADDR' => '100.101.102.103'
    'REMOTE_PORT' => '65446'
    'REQUEST_METHOD' => 'GET'
    'REQUEST_SCHEME' => 'http'
    'REQUEST_URI' => '/v1/2/controller/action'
    'SCRIPT_FILENAME' => '/home/myphpapp/public_html/index.php'
    'SCRIPT_NAME' => '/index.php'
    'SERVER_ADDR' => '50.51.52.53'
    'SERVER_ADMIN' => 'webmaster@myphpapp.com'
    'SERVER_NAME' => 'api.myphpapp.com'
    'SERVER_PORT' => '80'
    'SERVER_PROTOCOL' => 'HTTP/1.1'
    'SERVER_SIGNATURE' => ''
    'SERVER_SOFTWARE' => 'Apache'
    'UNIQUE_ID' => 'UxZd4zIcVQUAAFwqGD8AAAAG'
    'APP_SET' => 'api'
    'APP_MODE' => 'production'
    'PHP_SELF' => '/index.php'
    'REQUEST_TIME_FLOAT' => 1393974756.09
    'REQUEST_TIME' => 1393974756
    'argv' => array()
    'argc' => 0
)

我的(简化的).htaccess 是:

FileETag None
Options -Indexes
Options +FollowSymLinks

RewriteEngine On

#Vary Host cheat http://blog.iosart.com/2004/05/26/fooling-apache/
RewriteRule .*  - [E=MY_HTTP_HOST:%{HTTP_HOST}]

RewriteCond %{ENV:MY_HTTP_HOST} ^myphpapp\.com$ [NC]
RewriteRule ^(.*)$ http://www.myphpapp.com/$1 [R=301,L]

RewriteRule ^ - [E=APP_MODE:production]

RewriteRule ^ - [E=APP_SET:none]
RewriteCond %{ENV:MY_HTTP_HOST} ^www\.myphpapp\.com$ [NC]
RewriteRule ^ - [E=APP_SET:home] []
RewriteCond %{ENV:MY_HTTP_HOST} ^api\.myphpapp\.com$ [NC]
RewriteRule ^ - [E=APP_SET:api]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php

我正在运行 Apache 2.4.7 & PHP 5.4.25 & index.php 是一个 Yii 1.1.14 应用程序

最佳答案

我使用的 http 库中有一个错误。

以多部分 POST 结尾的边界有一个额外的 CRLF,并且 Content-Length 比它应该的大 2 个字节......这就是为什么 Apache 2.4.7 发送了 500 个响应并且 php global $_SERVER 的所有元素都有垃圾里面..

在这种特殊情况下,Apache 2.4.3 似乎忽略了额外的 CRLF 和错误的 Content-Length。

关于php - redirect_status 的奇数 (44),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22201434/

相关文章:

php - 如何通过 AJAX 发送大量数据并使用 PHP 插入 MySQL DB

apache - 在 php-fpm/mod_fastcgi 中使用 mod_headers 的问题

mysql - 加载页面 localhost/phpmyadmin 时出错

mysql - 长时间延迟加载在 Linux 上运行 Apache 2、worker、fastcgi 和 mysql 的 WordPress 网站

php - 如何在 EC2 上启动 Apache

javascript - HTML5 视频标签未在兼容浏览器中显示

.htaccess - Docker Image 中的 Mura CMS URL 重写(尾随/)

php - Laravel lmutator $this->属性返回 'Undefined index: id'

php - 使用 shell_exec() 在 php 脚本中执行 python

php - :class Attributes in Laravel Spark/Vue. js是什么