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

在我的.htaccess文件中,我已经定义了以下规则,使我的注册页面的URL为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或只是redirect任何直接register.php请求/注册/

如果你这样做,以避免获得多个链接到相同的内容,你可以简单地不使用“register.php”在你的网页上的任何地方。 我认为没有搜索引擎会“猜测”某个文件类型,如果没有安全问题,你是安全的,因为在我看来,没有用户会链接到这个文件。 然而,如果你想确定只是通过一个index.php通过你的.htaccess应该被放置在你的www根目录中的一行重新路由所有的功能:

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

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

 DENY from all 

还有其他一些选项可以防止直接访问。 只需在index.php中的某个地方define()一个变量,然后在register.php的顶部添加一个变量即可

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

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

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

更新

还有一件事是我想到的,你也可以检查$_SERVER["REQUEST_URI"] ,无论用户是否附加任何“.php”,并通过完全拒绝访问或只是重定向到新的位置来采取相应的行动。

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

只要你把它放进去,就说:

 Options -Indexes order allow,deny deny from all 

你可以复制粘贴这个文件到任何(根)目录你想保护免受外部执行。

要检查初始请求的URL路径,您需要使用请求行 。 所以试试这个规则:

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

然后你的规则(稍作修改):

 RewriteRule ^register/$ register.php 

尝试这个。

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

或这个

 Redirect register.php /register 

忽略用户体验部分,你可以实现新的rel = canonical链接来整理搜索引擎。

虽然,对于这种情况下,你应该可以使用301从/register.php重定向到/ register /

在register.php

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

如果你想通过使用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/

干杯,