1

作成したこのPHP関数でルートURLを取得するのに問題があります。私はそれを得ることができますが、サーバーごとに例外を作成する必要がありますが、代わりに1つの一貫した関数が必要です。修正方法を教えていただけますか?

Ubuntuワークステーションでは/var/ www / websiteの下にある特定のWebサイトのルートフォルダーに貼り付けますが、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スキルを持っています。そのため、きれいなURLには次のような.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手法では、URLの末尾にスラッシュを追加するなど、HTMLに適切な相対パスがない場合があるため、HTMLでタグを使用して、相対パスで処理する必要があることに注意してください。パス。これが、getRootURL()関数が正しく機能する必要がある理由です。

4

2 に答える 2

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に追加してみませんか?

于 2011-03-06T20:54:42.243 に答える
0

私が正しく理解していれば、CentOSのインストールは、Ubuntuワークステーション上にあるのに、仮想ホストのドキュメントルートにはありません。

そのような場合、関数の2つの異なる実装を持つことは私には自然に思えます。ENV変数またはSERVER_NAMEを区別するIF条件を設定し、いずれかを使用するだけです。

于 2011-03-06T20:59:32.040 に答える