我在使用 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()函数必须正常工作的原因。
答案 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上,并使用其中一个。