解説

  • 互換性を持たせるために、get_script_uri()で返される値は従来通り。
  • lib/init.phpで初期化している部分のみ、変更の必要あり。
  • pukiwiki.ini.phpの$script、$script_directory_indexの仕様に従う。
  • get_script_uri('rel')で相対uri取得
  • get_script_uri('rel_cut')で''取得(相対uriからindex.php削除したらnullになるはず)
  • get_script_uri('cut')で$script_directory_indexに関わらず絶対uriからindex.phpをとり除いたものを取得
    • 実装としては、最後の'/'以降を削除
  • 環境によって(ex. Windowsのanhttpd)ではSERVER_NAMEがローカルのマシン名になってしまうので、環境変数HTTP_HOSTが取得できる場合にはそれを使用する。
    • これを実装するなら、lib/init.phpの
      // Init server variables
      でHTTP_HOSTも取得した方がよいかな。

ソース

lib/func.phpのget_script_uriを以下のようにしてみました。

// Get absolute-URI of this script
// Arguments
// cut ... return absolute-URI. If $script_directory_index is set, cut the last $script_directory_index from $script.
//				or cut string after the last "/".
// rel ... return relative path. If $script_directory_index is set, return '' or return string after the last "/" of script path.
// rel_cut ... return ''
// others ... return absolute-URI.
function get_script_uri($uri_mode = '', $init_uri = '')
{
	global $script_directory_index;
	static $script, $script_relative, $script_cut;

	if ($init_uri == '') {
		 // Get
		 if (isset($script))
		 {
			  switch ($uri_mode) {
			  case 'rel':
				   return $script_relative;
				   break;
			  case 'cut':
				   return $script_cut;
				   break;
			  case 'rel_cut':
				   return '';
				   break;
			  default :
				   return $script;
				   break;
			  }
		 }

		 // Set automatically
		 $msg     = 'get_script_uri() failed: Please set $script at INI_FILE manually';

		 $script  = (SERVER_PORT == 443 ? 'https://' : 'http://'); // scheme
//		$script .= SERVER_NAME;	// host
		 if (isset($_SERVER['HTTP_HOST']))
		 {
			  $script .= $_SERVER['HTTP_HOST'];	// host
		 } else
		 {
			  $script .= SERVER_NAME;	// host
		 }
		 $script .= (SERVER_PORT == 80 ? '' : ':' . SERVER_PORT);  // port

		 // SCRIPT_NAME が'/'で始まっていない場合(cgiなど) REQUEST_URIを使ってみる
		 $path    = SCRIPT_NAME;
		 if ($path{0} != '/') {
			  if (! isset($_SERVER['REQUEST_URI']) || $_SERVER['REQUEST_URI']{0} != '/')
				   die_message($msg);

			  // REQUEST_URIをパースし、path部分だけを取り出す
			  $parse_url = parse_url($script . $_SERVER['REQUEST_URI']);
			  if (! isset($parse_url['path']) || $parse_url['path']{0} != '/')
				   die_message($msg);

			  $path = $parse_url['path'];
		 }
		 $script .= $path;

		 if (! is_url($script, TRUE) && php_sapi_name() == 'cgi')
			  die_message($msg);
		 unset($msg);

	} else {
		 // Set manually
		 if (isset($script)) die_message('$script: Already init');
		 if (! is_url($init_uri, TRUE)) die_message('$script: Invalid URI');
		 $script = $init_uri;
	}

	// Cut filename or not
	if (isset($script_directory_index)) {
		 if (! file_exists($script_directory_index))
			  die_message('Directory index file not found: ' .
						  htmlspecialchars($script_directory_index));
	}
	$matches = array();
	if (isset($script_directory_index)) {
		 if (preg_match('#^(.+/)' . preg_quote($script_directory_index, '#') . '$#',
						$script, $matches)) 
		 {
			  $script_cut = $matches[1];
			  $script_relative = '';
			  $script = $script_cut;
		 }
	} else {
		 if (preg_match('#^(.*)/(.[^/]*)$#',
						$script, $matches)) 
		 {
			  $script_cut = $matches[1] . '/';
			  $script_relative = $matches[2];
		 }
	}

	switch ($uri_mode) {
	case 'rel':
		 return $script_relative;
		 break;
	case 'cut':
		 return $script_cut;
		 break;
	case 'rel_cut':
		 return '';
		 break;
	default :
		 return $script;
		 break;
	}
}
  • init.phpの変更点
    *** init.php	Fri Apr 20 02:25:08 2007
    --- init.php.org	Fri Apr 20 02:24:57 2007
    ***************
    *** 126,132 ****
      // INI_FILE: Init $script
      
      if (isset($script)) {
    ! 	get_script_uri('', $script); // Init manually
      } else {
      	$script = get_script_uri(); // Init automatically
      }
    --- 126,132 ----
      // INI_FILE: Init $script
      
      if (isset($script)) {
    ! 	get_script_uri($script); // Init manually
      } else {
      	$script = get_script_uri(); // Init automatically
      }

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2008-01-08 (火) 10:41:20
Site admin: PukiWiki Development Team

PukiWiki 1.5.2+ © 2001-2019 PukiWiki Development Team. Powered by PHP 5.6.40-0+deb8u7. HTML convert time: 0.164 sec.

OSDN