我有一个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]
答案 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]