在PHP中获取根URL的问题

时间:2011-03-06 20:35:50

标签: php .htaccess relative-path base-tag

我在使用 PHP函数编写根URL 时遇到问题。我可以得到它,但我必须为每台服务器制作例外,但我希望一个一致的功能。你能告诉我如何解决它吗?

我把它粘贴在给定网站的根文件夹中,在我的Ubuntu工作站上它位于/ var / www / website下,但在我的CentOS服务器上它可能位于/ home / me / website下。它适用于我的工作站,但在服务器上我必须出于某种原因制作不同的版本。此外,我还有另一个版本,我不得不为另一个似乎不喜欢这个功能的CentOS服务器。在这个问题的尾部,我还列出了一些关于我为什么要这样做的背景信息。

工作站版本

public function getRootURL() {
  $sTemp = str_replace($_SERVER['DOCUMENT_ROOT'],'',__DIR__);
  $sTemp = str_replace($sTemp, '', $_SERVER['REQUEST_URI']);
  $sPageURL = (@$_SERVER['HTTPS'] == 'on') ? 'https://' . $_SERVER['SERVER_NAME'] : 'http://' . $_SERVER['SERVER_NAME'];
  $sPageURL .= ($_SERVER['SERVER_PORT'] != 80) ? ':' . $_SERVER['SERVER_PORT'] . $_SERVER['REQUEST_URI'] : $_SERVER['REQUEST_URI'];
  $sRootURL = str_replace($sTemp,'',$sPageURL);
  $sRootURL = rtrim($sRootURL, '/') . '/';
  $sRootURL = (strpos(' ' . $sRootURL, '://') === FALSE) ? $sPageURL : $sRootURL;
  return $sRootURL;
}

服务器版

public function getRootURL() {
  $sTemp = str_replace($_SERVER['DOCUMENT_ROOT'],'',__DIR__);
  $sTemp = str_replace($sTemp, '', $_SERVER['REQUEST_URI']);
  $sPageURL = (@$_SERVER['HTTPS'] == 'on') ? 'https://' . $_SERVER['SERVER_NAME'] : 'http://' . $_SERVER['SERVER_NAME'];
  $sPageURL .= ($_SERVER['SERVER_PORT'] != 80) ? ':' . $_SERVER['SERVER_PORT'] . $_SERVER['REQUEST_URI'] : $_SERVER['REQUEST_URI'];
  $sRootURL = str_replace($sTemp,'',$sPageURL);
  $sRootURL = rtrim($sRootURL, '/') . '/';
  $sRootURL = (strpos(' ' . $sRootURL, '://') === FALSE) ? $sPageURL : $sRootURL;
  if (strpos(' ' . $sRootURL, 'mycentosserver.com')>0) {
    $sRootURL .= 'website/';
  }
  return $sRootURL;
}

在服务器版本上,注意“mycentosserver.com”if / then语句 - 这就是区别。

备用服务器版本

function getRootURL() {
  $sTemp = str_replace($_SERVER['DOCUMENT_ROOT'],'',__DIR__);
  $sTemp = str_replace($sTemp, '', $_SERVER['REQUEST_URI']);
  $sPageURL = (@$_SERVER['HTTPS'] == 'on') ? 'https://' . $_SERVER['SERVER_NAME'] : 'http://' . $_SERVER['SERVER_NAME'];
  $sPageURL .= ($_SERVER['SERVER_PORT'] != 80) ? ':' . $_SERVER['SERVER_PORT'] . $_SERVER['REQUEST_URI'] : $_SERVER['REQUEST_URI'];
  $sRootURL = str_replace($sTemp,'',$sPageURL);
  $sRootURL = rtrim($sRootURL, '/') . '/';
  $sRootURL = (strpos($sRootURL, '://') === FALSE) ? $sPageURL : $sRootURL;
  $sRootURL .= 'website2/'; // heck, I give up -- strange Apache problem on this server
  return $sRootURL;
}

背景

通常我会使用MVC框架,但我有一个客户端想要在我离开时编辑内容,以及谁不喜欢MVC并且不理解它。他有简单的PHP技能。所以,我正在使用一个.htaccess看起来像漂亮的URL,而斜杠可以出现在URL的末尾,或者:

Options -Indexes +FollowSymlinks -MultiViews
RewriteEngine on

#No slash on the end of the url and not a real file/folder? then show x.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^[^/]*$ "$0.php" [nc]

#slashes on the end still and not a real file/folder, then remove them
RewriteCond %{REQUEST_URI} ^(.*)//(.*)$
RewriteRule . %1/%2 [R=301,L]

#if still here, and not a real file/folder, then show x.php in the alternative way
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)/$ "$1.php" [nc]

我正在创建像_css,_js,_classes等子文件夹 - 试图让事情变得相当简单。每个页面的顶部都有PHP,然后是HTML底部的params。这是为了试图消除意大利面条代码。客户端似乎喜欢这样,虽然我更喜欢MVC,特别是对于这个根URL的原因。

请注意,使用.htaccess技术时,有些情况下我的HTML可能没有正确的相对路径,例如有人在URL的末尾添加斜杠,因此我必须在HTML中使用标记来清除事物相对路径。这就是getRootURL()函数必须正常工作的原因。

2 个答案:

答案 0 :(得分:1)

这个怎么样?

function getRootURL() {
  $protocol   = empty($_SERVER['HTTPS'])? 'http' : 'https';
  $servername = $_SERVER['SERVER_NAME'];
  $serverport = $_SERVER['SERVER_PORT']=='80'? '' : ':' . $_SERVER['SERVER_PORT'];
  $path       = str_replace('\\', '/', substr(dirname(__FILE__), strlen($_SERVER['DOCUMENT_ROOT'])));

  return $protocol . '://' . $servername . $serverport . $path;
}
只要文件确实位于项目的根目录中,

__FILE__就可以正常工作(否则再添加几个dirname()


顺便说一句,如果您担心“某人在网址末尾添加斜杠”,为什么不将/?添加到您的RewriteRule?

答案 1 :(得分:0)

如果我理解正确,您的CentOS安装不在虚拟主机文档根目录中,而是在Ubuntu工作站上。

在这种情况下,有两种不同的函数实现对我来说似乎很自然。 只需将IF条件置于某些ENV var或SERVER_NAME上,并使用其中一个。