2012-03-05 61 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