簡體   English   中英

使用數據庫查找腳本Mod_ReWrite / ReWriteMap URL

[英]Mod_ReWrite / ReWriteMap a URL using a database lookup script

場景
我已經完全將舊的ASP經典電子商務網站改寫為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情況下實現此目標的最佳/正確解決方案。

您的查詢:

SELECT
  ID
FROM
  thetable
WHERE
  ProductID=?

從那里回顯ID和換行符的值,然后刷新標准輸出。

重寫規則:

RewriteMap dbfixup prg:dbfixup.script
RewriteCond %{QUERY_STRING} ProductID=(\d+)
RewriteRule Product.asp Products.php?ID=${dbfixup:%1}

您應該為新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;';
    ...

在發現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等都接受2x 301重定向,不會出現問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM