使用mod_rewrite隐藏实际的URL

时间:2012-03-05 13:02:38

标签: php apache mod-rewrite

我有一个php网站,我正在使用mod_rewrite来重定向所有的URL请求。假设我有一个product.php脚本,我有一个规则:

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/1时,将向他显示实际网址为http:/www.mysite.com/product.php?pid=1的网页。

但是,我想强制用户访问我的网站,完全取决于我提供的规则。我的意思是,当用户键入http:/www.mysite.com/something或甚至某些正确的网址(例如http:/www.mysite.com/product.php?pid=1)时,他应该被重定向到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 个答案:

答案 0 :(得分:1)

你可以添加一个catch all作为最后一次可能的重写并将其映射到404.php(或者你不想要的任何东西)。

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

事实证明,当它命中product / 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]