如何使用htaccess规则停止直接执行php页面?

时间:2009-07-09 04:53:25

标签: php apache .htaccess url-rewriting

在我的.htaccess文件中,我定义了以下规则,使我的注册页面网址为http://example.com/register/

RewriteRule register/ /register.php

上述规则完全正常,但我可以从http://example.com/register/以及http://example.com/register.php访问我的注册页面。

我不希望该用户能够从http://example.com/register.php URL访问该URL,是否有任何我可以在.htaccess中定义的规则来停止执行register.php URL或只是重定向任何直接寄存器.php请求/ register /

6 个答案:

答案 0 :(得分:4)

如果您这样做是为了避免获得相同内容的多个链接,则只需在页面的任何位置不使用“register.php”即可。我认为没有搜索引擎会“猜测”某种文件类型,如果没有安全问题,那么你是安全的,因为我认为没有用户会链接到这个文件。但是,如果您想确定只需通过index.php通过.htaccess中的一行重新路由所有功能,该行应放在www-root目录中:

RewriteEngine on
RewriteRule ^(.*?)$ index.php?file=$1

在index.php中,您可以通过分解并检查$ _GET [“file”]参数来简单地选择要调用的函数/文件。要100%确定没有人可以直接访问你的register.php文件,只需将它(以及所有其他人)移动到一个单独的目录中,并包含一个.htaccess文件,其中包含以下行:

DENY from all 

还有其他一些选项可以阻止直接访问。只需define() index.php中的某个变量和register.php顶部的变量就可以了

defined('access') or die('Intruder alert!');

在顶部。另一种方法可能是诚实,只是告诉搜索引擎你的内容已被移动,他们不再使用旧的链接:

header("Status: 301"); /* Content moved permanently */
header("Location: http://yourserver/Register/");
exit;

<强>更新

还有一件事在我脑海中浮现,您还可以检查$_SERVER["REQUEST_URI"],用户是否附加了任何“.php”,并通过完全拒绝访问或仅重定向到新位置来采取相应行动。

答案 1 :(得分:3)

确实您不能使用location指令,但实际上可以将.htaccess文件粘贴到任何目录中。

如果你把它放进去,请说:

Options -Indexes
order   allow,deny
deny    from all

您可以将此文件复制粘贴到要防止外部执行的任何(根)目录中。

答案 2 :(得分:1)

要检查初始请求的网址路径,您需要使用request line。所以试试这条规则:

RewriteCond %{THE_REQUEST} ^GET\ /[^?\s]+\.php[/?\s]
RewriteRule (.+)\.php$ /$1 [L,R=301]

然后又是你的规则(稍加修改):

RewriteRule ^register/$ register.php

答案 3 :(得分:0)

试试这个。

RewriteCond %{REQUEST_FILENAME} ^register\.php$ [NC]
RewriteRule ^/register register.php

或者这个

Redirect register.php /register

答案 4 :(得分:0)

忽略用户体验部分,您可以实施new rel=canonical link来整理搜索引擎。

虽然对于这个的情况,你应该只使用从/register.php的301重定向到/ register /

在register.php中

if ( stristr( $_SERVER['REQUEST_URI'], '.php' ) )
{
    header ('HTTP/1.1 301 Moved Permanently');
    header ('Location: /register');
}

答案 5 :(得分:0)

如果您想使用mod_rewrite完全阻止/register.php,请使用SleepyCod答案的变体:

RewriteCond %{REQUEST_FILENAME} register\.php [NC]
RewriteCond %{IS_SUBREQ} false
RewriteRule .* - [F,L]

说明:

  • [NC]:使条件不区分大小写,以防您使用的是Windows框。
  • 条件1:请求的文件名是'register.php',
  • 条件2:请求是子请求(这很重要,因为通过RewriteRules的每一轮新实际创建了子请求)。
  • 规则:基本上什么都不做
  • 标志:[F]:发送403 Forbidden标头,[L]:这是要应用的最后一条规则,跳过所有后续重写规则

正确重写本身就是一门艺术。我建议你仔细阅读http://httpd.apache.org/docs/2.2/rewrite/

干杯,