Edited at

NGINX+HTTPS(SSL)+PHPのサーバーでのiOS(WebKit)におけるロケーションヘッダーの挙動メモ

More than 1 year has passed since last update.

自鯖でhttps(ssl)化した時にphpでロケーションヘッダを使った時に思わぬ挙動をしたのでメモ


環境


  • DTI ServersMan@VPS Entryプラン

  • Ubuntu 14.04.3 LTS

  • PHP 5.5.9-1ubuntu4.14

  • NGINX 1.9.10

  • iOS 9.3.1


PHPファイル


redirect.php

<?php

// $urlに代入
$url = 'http://example.com/'

// リダイレクト
header('Location: ' . $url);



実行結果

http://example.com/,http://example.com/

というようになぜかカンマ(,)を挟んで2回目繰り返されたリンクへリダイレクトしてしまいます

HTTPSにしているときだけこうなるのでiOSのバグなのかわかりませんが動かないものは仕方がないという感じでとりあえず


redirect.php

 <?php

//...

// リダイレクト
- header('Location: ' . $url);
+ header('refresh:1;url=' . $url);


という形にしています


追記


追記1

リフレッシュの書き方が間違っていたので修正

-header('refresh:1,url=' . $url);

+header('refresh:1;url=' . $url);


追記2

Windows10の内蔵ブラウザであるMicrosoft EdgeでリフレッシュヘッダーだとPOSTが残ってしまうのでそれの対処として


functions.php

<?php

//...

// iOSのみrefreshヘッダーにする
public function http_refresh($url) {
$ua = $_SERVER['HTTP_USER_AGENT'];
if(strpos($ua,'iPhone') || strpos($ua,'iPod') || strpos($ua,'iPad')) {
$browser = 'ios';
}
if($browser === 'ios'){
header('refresh:1;url=' . $url);
}else{
header('Location: ' . $url);
}
}


を追加して


redirect.php

  <?php

//...

+ // functions.phpの読み込み
+ include(dirname(__file__) . '/functions.php');

//$urlへリダイレクト
- header('refresh:1;url=' . $url);
+ http_refresh($url);


とすることでLocationヘッダーが動く環境で使えるようにしています