我遇到问题了根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()函数必须正常工作。
如果用户请求放置在网站根目录下的目录中的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
@rahmanisback - Volomike说他正在_sticking it_ [根生成文件] _在给定website_的根文件夹中。因此'dirname(__ FILE __)'将转化为网站的根目录。这样,它不是特定于应用程序的。所以正如我在我的回答中提到的 - 只要具有函数定义的文件位于网站的根目录中,它就应该正确翻译。 – Czechnology 2011-03-07 00:13:12
@技术:谢谢!我在3种情况下测试了你的代码 - 2个完全CentOS配置,以及一个Ubuntu 10.04桌面配置(我的工作站)。 **它在所有3种情况下都有效**唯一的改进是我在末尾添加了rtrim()检查以删除任何结束斜线(如果可能的话),然后添加到另一个斜线上以便我的BASE标签喜欢它。同样,我将它固定在_classes子文件夹中,然后从路径中移除“/ _classes”。 – Volomike 2011-03-07 06:55:01