8

私がやろうとしているのは、同じ Web アプリケーションの複数のバージョンを処理することです。これは、Google が「新しいバージョンを試す」リンクを取得する一部の製品で行うのと似ています。

目標は、Web アプリケーションの「安定版」と「ベータ版」の両方のバージョンを用意し、ユーザーが新しい機能 (およびそのバグ) を強制することなく試用できるようにすることです。

これを行う非常に簡単な方法は、www.mywebapp.com/v1 や www.mywebapp.com/v2 のように、各バージョンを独自のサブフォルダーに配置することです。

ただし、これはユーザーに対して透過的であり、webapp URL は同じままである必要があります (例: www.mywebapp.com/)。

どのバージョンをロードする必要があるかは、ユーザーがログインした後にサーバー側で決定され (たとえば、特定のユーザーのアクティブなバージョンが DB に保存されます)、後でユーザーが「新しいバージョンを試す」/「移動」をクリックすると変更される場合があります。古いバージョンに戻る」リンク。

サーバー側では、MySQL、PHP、および Apache で間に合わせる必要があります。

各バージョンを独自のサブフォルダーに配置し、バージョン情報をCookieに保存し(ログインまたはページの更新ごとにサーバーによって更新されます)、RewriteRuleを使用してベース/バージョンレスからのリクエストを「プロキシ」することで、すでにこれを機能させることができました適切なサブフォルダーへの URL。Cookie が設定されていない場合は、フォールバック RewriteRule によって既定のフォルダーが選択されます。

このクラッジは機能しますが、非常に壊れやすく、Apache デーモンに追加の負担がかかるため、これを行うためのより良い方法を誰かが知っているかどうかを尋ねています。

ありがとう!

4

7 に答える 7

6

htaccessでは、Cookieの内容に基づいて書き換えを行うことができます。Apacheはリダイレクトで素晴らしいですし、PHPで十分なので、私はそれをそのように扱います。

この例では、verscookieがあるかどうかをテストします。存在する場合は、'vers ='+verscookieに含まれていたものをリクエストに追加します。

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_COOKIE} vers=([^;]+) [NC]
RewriteRule ^(.*)$ /$1?vers=%1 [NC,L,QSA]

(その例はここにあります)

于 2011-08-28T02:57:24.193 に答える
2

単一の RewriteRule を使用して、すべての要求をroute.phpWeb サイトのルート フォルダー内の単一のファイルに再ルーティングします。

ファイルは次のroute.phpようになります。

$user = authenticateUser();
$version = $user->getPreferredVersion();

$filePath = $_SERVER['DOCUMENT_ROOT'].'v'.$version.$_SERVER['REQUEST_URI'];

if( !file_exists( $filePath ) ) {
    header("Status: 404 Not Found", true, 404 );
    die();
}

$pathDetails = pathinfo( $filePath );

if( $pathDetails['extension'] == 'php' ) {
    require( $filePath );
} else {
    if( $pathDetails['extension'] == 'jpg' ) {
        header( 'Content-Type: image/jpeg' );
    } elseif( $pathDetails['extension'] == 'gif' ) {
        ...
    } elseif (...) {
        ...
    } else {
        // unsupported file type
        header("Status: 404 Not Found", true, 404 );
        die();
    }
    echo file_get_contents( $filePath );
}

route.phpこれは、そのファイルで対処する必要があるその他のセキュリティおよび技術的な問題がある中で行うべきことの概要です。

于 2011-08-27T09:35:25.580 に答える
2

include()PHP でのより良い方法は、単純にデータベースにクエリを実行し、目的のバージョンを取得してから、サブフォルダーから取得することだと思います。そうすれば、ユーザーには透過的です。

たとえば、ユーザーが新しいベータ版にオプトインしたと仮定すると、そのユーザーのエントリをデータベースに保存します。

UPDATE `versions_table` SET (`version`) VALUES ('1.02b') WHERE `userid` = 5

そして、彼がページにアクセスすると、次のようなことが起こっています。

//PDO Connection here, skipped for example purposes
$stmt = $pdo->query('SELECT `version` from `versions_table` WHERE `userid` = 5 LIMIT 1'); 
//Of course 5 is only an example, in actual code that would be a variable
//representing the actual user ID.
$row = $stmt->fetch(); //Should be only one row.
include_once($row['version'].'/myApp'.'.php'); //Include 1.02b/myApp.php
于 2011-08-27T06:45:18.653 に答える
0

ルーティング メカニズムとセッション情報を使用してルールを作成することは可能ですが、現在のソリューションを保持したいと思います。PHP で実装する場合は、Apache2 (既に非常に高速な Rewrite-Engine を備えています) から php-binary に負荷をプッシュするだけです。また、データ、Cookie、およびその他のセッションベースの変数の非互換性が原因で、アプリケーションがバージョンに干渉するリスクにさらされることになります。

一方で、ライブラリ、ドメイン モデル、データ マッパーなどの共有オブジェクトを再利用できるという利点があります。しかし、私の意見では、この利点は、パフォーマンスの低下や干渉のリスクを強調するものではありません。

つまり、一言で言えば、現在のソリューションが最適だと思います。

于 2011-08-27T17:39:46.607 に答える
0

展開時にこれを自動的に行うクラウド プラットフォームがあります。www.cycligent.com
2 つのバージョンがデプロイされたら、Cookie を設定するだけです。示されている他の回答のいくつかよりもはるかに少ない作業です。
完全開示: 私は Cycligent で働いています。

于 2015-04-02T23:39:47.043 に答える
0

バージョン管理されたページ/web ページを IFRAME にロードします。IFRAME src は「webapp.com/v2」の可能性があります。

したがって、どのバージョンのユーザーがアドレス バーを選択しても、webapp.com が表示されます。しかし、IFRAME の URL はバージョンによって変わり続けます。

書き換えルールを書く必要はありません。

于 2011-08-31T11:29:21.243 に答える