2011-03-06 33 views
1

我遇到问题了根URL与此PHP函数我组成。我可以得到它,但我必须使每台服务器例外,但我想需要一个一致的功能,而不是。你能告诉我如何解决它吗?在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的末尾,或者:

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中的底部。这是试图消除意大利面代码。客户似乎喜欢这一点,但我更喜欢MVC,特别是对于这个根URL的原因。

但是,使用.htaccess技术注意,有些情况下我的HTML可能没有适当的相对路径,比如有人在URL的末尾添加了斜线,因此我必须在HTML中使用标记来清除事情与相对路径。这就是为什么getRootURL()函数必须正常工作。

回答

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()秒。


顺便说一句,如果你担心“有人加入一个URL末尾的斜线“,为什么不只是将/?添加到您的RewriteRule中?

+0

如果用户请求放置在网站根目录下的目录中的PHP文件,该怎么办? 假设文件根目录为/ var/www,而网站位于/ var/www/website /下,因此根网址为http://domain.com/website ,http请求用于http://domain.com /website/a/b/c.php 你的功能不能得到http://domain.com/website/以上?因为它是关于特定的应用程序的URL而不是服务器的URL – rahmanisback 2011-03-07 00:01:09

+0

@rahmanisback - Volomike说他正在_sticking it_ [根生成文件] _在给定website_的根文件夹中。因此'dirname(__ FILE __)'将转化为网站的根目录。这样,它不是特定于应用程序的。所以正如我在我的回答中提到的 - 只要具有函数定义的文件位于网站的根目录中,它就应该正确翻译。 – Czechnology 2011-03-07 00:13:12

+0

@技术:谢谢!我在3种情况下测试了你的代码 - 2个完全CentOS配置,以及一个Ubuntu 10.04桌面配置(我的工作站)。 **它在所有3种情况下都有效**唯一的改进是我在末尾添加了rtrim()检查以删除任何结束斜线(如果可能的话),然后添加到另一个斜线上以便我的BASE标签喜欢它。同样,我将它固定在_classes子文件夹中,然后从路径中移除“/ _classes”。 – Volomike 2011-03-07 06:55:01

0

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

在这种情况下,有2个不同的函数实现对我来说似乎很自然。 只需放置一个IF条件来区分某些ENV变量或SERVER_NAME并使用其中一个。