リンクを絶対パスで

htmlヘルパーとか、formヘルパーなんかで生成されたURLって基本的に相対パスで書かれる。これを絶対パスで書いてもらおうとするお話。

とりあえず、cake/lib/router.phpを見てみる

 * @param mixed $full If (bool) true, the full base URL will be prepended to the result.
 *   If an array accepts the following keys
 *    - escape - used when making urls embedded in html escapes query string '&'
 *    - full - if true the full base URL will be prepended.
 * @return string Full translated URL with base path.
 * @access public
 * @static
 */
	function url($url = null, $full = false) {
		$self =& Router::getInstance();
		$defaults = $params = array('plugin' => null, 'controller' => null, 'action' => 'index');

おお、router::urlの第二引数をtrueにすればいいらしい。


とりあえず、デフォルト値をtrueにしてみたんだが、相対パスで出力された。
htmlヘルパーを見てみると

	function link($title, $url = null, $options = array(), $confirmMessage = false) {
		$escapeTitle = true;
		if ($url !== null) {
			$url = $this->url($url);
		} else {
			$url = $this->url($title);
			$title = $url;
			$escapeTitle = false;
		}

で、

	function url($url = null, $full = false) {
		return h(Router::url($url, $full));
	}

ってなってた。

urlメソッドで$fullは受け取れるようになってるんだが、linkメソッドで値を渡していないので、相対パスになってしまう。

ヘルパーの各メソッドを直すのは筋悪なので、router.phpに手をつけることにした。

	function url($url = null, $full = false) {
		/* ここで無条件にtrueに変更 */
		$full = true;

		$self =& Router::getInstance();
		$defaults = $params = array('plugin' => null, 'controller' => null, 'action' => 'index');

		if (is_bool($full)) {
			$escape = false;

で、全部のリンクが絶対パスになった。
同一サイト内のリンクは相対パスでもいいのだが、SEO的には絶対パスのほうが価値が高いという説があるのでその対応でした。