0

シナリオ
古い既存の ASP の従来の e コマース Web サイトを PHP に完全に書き直しました。

以前のサイトのデータベース設計には、データベース内の他のテーブルへの製品データ行の面倒なリンクを引き起こすリレーショナル ID の問題が多数ありました。

これを回避するために、データベースを再設計し、製品に新しい主キーを与えながら、製品の古い PK を含む列をテーブルに保持しました。

問題
私が抱えている問題は、サイトが再開されたときです。以前は「Product.asp?ProductID=29」を指していたすべての検索エンジン リンクを使用して、データベースを検索し、製品の古い PK を照合し、製品にリダイレクトする必要があります。新しい PK、つまり「Products.php?ID=53」。

Mod_ReWrite/ReWriteMap でこれを実行しようとしていますが、オンラインで見つけることができるすべてのドキュメントには、データベース スクリプト PK ルックアップの処理方法が記載されていません。

更新http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritemap
> 外部書き換えプログラム で Ignacio Vazquez-Abrams の提案をさらに読みましたが、それは正しく、理想的であるようです解決。 ただし、ホストに連絡した後、サーバーで有効にしません。
ReWriteMap

私は自分自身を提供しましたが、ReWriteMap有効にせずにこれを達成するための最良/正しい解決策ではありません。

4

3 に答える 3

1

クエリ:

SELECT
  ID
FROM
  thetable
WHERE
  ProductID=?

そこから、値IDと改行をエコーし​​、stdout をフラッシュします。

ルールを書き直す:

RewriteMap dbfixup prg:dbfixup.script
RewriteCond %{QUERY_STRING} ProductID=(\d+)
RewriteRule Product.asp Products.php?ID=${dbfixup:%1}
于 2010-01-25T04:40:44.660 に答える
0

RewriteMapホストによって無効になっていることがわかった後mod_rewrite、2x 301 リダイレクトを使用するだけで独自のソリューションに到達しました。

.htaccess ファイル

RewriteEngine on
RewriteRule ^Product(.*)\.asp SEO_Redirect.php [NC,R=301]

SEO_Redirect.php ファイル

$ID = $_GET['ID'];

$query_rsNewID = "SELECT NewProductID FROM Products WHERE OldProductID = '$ID'";
$rsNewID = mysql_query($query_rsNewID, $Database);
$row_rsNewID = mysql_fetch_assoc($rsNewID);

header ('HTTP/1.1 301 Moved Permanently');
header ('Location: Product.php?ID='.$row_rsNewID['NewProductID']);

これは各ファイルの簡単な抜粋であり、SQL インジェクションに対して安全ではないことに注意してください。

願わくば、Google も同様に、2 回の 301 リダイレクトを問題なく受け入れてくれることを願っています。

于 2010-01-29T07:07:37.250 に答える
0

新しい ID には別の get 変数名が必要です。そうすれば、新しいプログラムで、古い ID を使用して製品を照合するか、新しい ID を使用して製品を照合するかがわかります。

$old = isset($_GET['id']) && is_numeric($_GET['id']) && $_GET['id'] > 0 ? $_GET['id'] : 0;
$new = isset($_GET['new']) && is_numeric($_GET['new']) && $_GET['new'] > 0 ? $_GET['new'] : 0;
if ($old + $new > 0) {
    $query = 'SELECT * FROM `ProductDetails` WHERE '.($old > 0 ? '`OrigPrdID`='.$old : '`PrdDetID`='.$new).' LIMIT 1;';
    ...
于 2010-01-26T12:00:54.760 に答える