ファイル転送サーバ:トラブルシュート
ダウンロードエラー
Ingress-NGINXなどのリバースプロキシでTLS終端を行うと、バックエンドのApacheサーバではリクエストがHTTPとして処理されます。これにより、PHPアプリケーションが生成するファイルのダウンロードURLが http:// となり、LinphoneなどHTTPSを必須とするクライアントではダウンロード(401エラー)に失敗します。これは、クライアント側がHTTPSを要求している一方で、サーバがHTTP URLを返してしまうという不整合によって発生する問題です。
hft.php
修正前
$prefix = (isset($_SERVER["HTTPS"]) && strtolower($_SERVER["HTTPS"]) == "on") ? "https" : "http";
$start = $prefix . "://" . $ipport . ':' . $_SERVER['SERVER_PORT'] . dirname($_SERVER['REQUEST_URI']);
$http_url = $start . "/tmp/" . basename($uploadfile); // file will be served in the ./tmp/ directory on the server path
修正案A:HTTPSでのみアクセスする場合
SERVER_PORT → HTTP_X_FORWARDED_PORT へ変更
$prefix = (isset($_SERVER["HTTPS"]) && strtolower($_SERVER["HTTPS"]) == "on") ? "https" : "http";
$start = $prefix . "://" . $ipport . ':' . $_SERVER['HTTP_X_FORWARDED_PORT'] . dirname($_SERVER['REQUEST_URI']);
$http_url = $start . "/tmp/" . basename($uploadfile); // file will be served in the ./tmp/ directory on the server path
注)nginxの設定ファイルで明示的に以下を記述
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-Port 443;
proxy_set_header Authorization $http_authorization;
注)Apacheの設定ファイルで以下を追加
<IfModule setenvif_module>
SetEnvIf X-Forwarded-Proto "https" HTTPS=on
# Set up the environment variable for the Authorization header
SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
</IfModule>
修正案B:HTTPまたはHTTPSでアクセスする場合
$prefix = (isset($_SERVER["HTTPS"]) && strtolower($_SERVER["HTTPS"]) == "on" || isset($_SERVER["HTTP_X_FORWARDED_PROTO"]) && strtolower($_SERVER["HTTP_X_FORWARDED_PROTO"]) == "https") ? "https" : "http";
$serverport = $_SERVER['HTTP_X_FORWARDED_PORT'] ?? $_SERVER['SERVER_PORT'];
$start = $prefix . "://" . $ipport . ':' . $serverport . dirname($_SERVER['REQUEST_URI']);
$http_url = $start . "/tmp/" . basename($uploadfile); // file will be served in the ./tmp/ directory on the server path
注)HTTP_***などのヘッダー環境変数はphpinfo()で確認すること。
サイズ制限
アップロードするファイルサイズはphp.iniとnginxの設定で決まります。
/etc/nginx/default.conf
client_max_body_size 100M;
/usr/local/etc/php/php.ini
upload_max_filesize = 50M
post_max_size = 100M
Linphoneログアップロードエラー
ダイジェスト認証を有効にした場合、Linphoneでログのアップロードプロセスがエラーになります。Linphoneのログをアップロードする際には、ダイジェスト認証を無効にするか、ダイジェスト認証を有効にした場合は hft.php に下記コードを追加して対応します(この場合、直接ホストからダウンロード)。
hft/hft-server/hft.php
function process_request() {
if (
$_SERVER['REQUEST_METHOD'] === 'POST' &&
(int)($_SERVER['CONTENT_LENGTH'] ?? 0) === 0
) {
fhft_log(LogLevel::DEBUG,
"Empty POST detected, returning 204");
http_response_code(204);
exit();
}
また、最新の登録アカウントによりログのアップロードが実行されるため、アカウントのドメインがファイルサーバのドメインと一致しない場合も認証エラーが発生します。