[英]Apache mod_rewrite: RewriteMap directive using PHP script on Windows machine
[英]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.