2012-03-05 98 views
0

我有一個php網站,我使用mod_rewrite來重定向所有的URL請求。假設我有一個product.php劇本,我有這方面的規則:使用mod_rewrite隱藏實際的URL

RewriteRule ^product/([0-9]+).*/?$ product.php?pid=$1 [L,NC] 
RewriteRule ^category/([0-9]+).*/?$ category.php?cid=$1 [L,NC] 

到目前爲止,一切進展順利,並在用戶類型:http://www.mysite.com/product/1http:/www.mysite.com/product.php?pid=1實際URL頁面將顯示給他。

但是,我想強制用戶訪問我的網站,完全從我提供的規則。我的意思是當用戶鍵入http:/www.mysite.com/something或者甚至像http:/www.mysite.com/product.php?pid=1這樣的正確URL時,他應該被重定向到404錯誤頁面。這可以是一個自定義腳本或apache的默認404頁面。

這可能嗎?

編輯:根據要求,我張貼我的整個.htaccess文件:

Options +FollowSymLinks 
Options +Indexes 

RewriteEngine on  
RewriteBase /websitename 
RewriteRule ^product/([0-9]+).*/?$ product.php?pid=$1 [L,NC] 
RewriteRule ^category/([0-9]+).*/?$ category.php?cid=$1 [L,NC] 

回答

1

你可以只添加一個包羅萬象的作爲最後可能改寫並映射它404.php(或任何你wan't )。

RewriteRule ^(.*)$ 404.php?attempt=$1 [L,NC] 

只需將它放置在重寫底部即可。

編輯:

我測試了這一點,我自己(我通常不使用重寫這樣):

RewriteEngine on  

RewriteRule ^product/([0-9]+).*/?$ product.php?pid=$1 [L] 
RewriteRule ^category/([0-9]+).*/?$ category.php?cid=$1 [L] 

RewriteRule ^(.*)$ 404.php?attempt=$1 [L] 

而且還發現,404將每次擊中。顯然這是.htaccess的預期行爲。 (https://stackoverflow.com/a/3642271/603184

所以,原來你需要它停止匹配,當它擊中的產品/ category.php,這可以通過添加來完成:

RewriteRule ^category.php$ - [L] 
RewriteRule ^product.php$ - [L] 

404重定向之前。導致:

RewriteEngine on  

RewriteRule ^product/([0-9]+).*/?$ product.php?pid=$1 [L] 
RewriteRule ^category/([0-9]+).*/?$ category.php?cid=$1 [L] 

RewriteRule ^category.php$ - [L] 
RewriteRule ^product.php$ - [L] 

RewriteRule ^(.*)$ 404.php?attempt=$1 [L] 
+0

我以前試過。它只是將所有網址重定向到此頁面,即使我的所有規則都有L標誌。 – 2012-03-05 13:19:54

+0

這很奇怪,它通常適合我。你能告訴我們整套RewriteRules嗎? – 2012-03-05 13:23:36

+0

我編輯了我的答案。 – 2012-03-05 13:33:25