关于php:仅允许登录用户查看托管在同一服务器和域(在子文件夹中)的外部html站点

Allow only signed in users to see external html site hosted on the same server and domain (in sub folder)

我有一个PHP站点(站点A,CakePHP 2.3),带有其自己的登录系统。然后,我在同一台服务器上有另一个"站点"(实际上是具有自己的index.html的html生成的电子书),但是在不同的文件夹中,我们将其称为站点B。

我试图仅允许在站点A上具有有效会话的用户(已使用有效凭据登录)查看该电子书(访问该index.html文件)。这背后的主要思想是防止用户直接共享站点B的URL。

如果我可以从站点B检查站点A上用户的会话,这将很容易,我可以仅检查$ _SESSION变量,但这是不可能的。

最简单的方法是什么?虽然不是最好的选择,但是我必须从站点B编辑该index.html文件以添加任何有助于此操作的代码也可以。

我想到的一种方法是从站点A到站点B进行一些javascript重定向,其中包括POST变量,如果该变量不存在,则不会显示任何内容。这将需要在站点B的index.html上添加一些php,但是我不确定这是否是最佳解决方案,我想知道是否还有更好的方法。

此外,我有100本书,所以如果我可以大量应用,那会更好。

编辑:

为澄清起见,两个站点都位于同一服务器中,并且具有相同的"域"。要打开站点B,我使用站点A的符号链接。例如:

  • 站点A网址:http://example.com

  • 站点B网址:PHP从站点A重定向到" / symlink / to / siteB / location /"),实际上,它会将用户带到http://example.com/symlink/to/siteB/location/


创建代理

我将使用.htaccess将指向书中页面的所有URL重定向到CakePHP应用程序中的自定义action

action检查凭据,如果确定,则从磁盘读取实际请求的文件并将其发送到浏览器。不要重定向回,否则会导致重定向循环!

当然,您需要创建一个重定向,该重定向将原始请求的页面作为参数传递,以便您知道要读取的文件。

当然,这不是超级有效的方法,但它可以工作。我必须在一个旧项目中解决完全相同的问题。

笔记

请确保您的.htaccess规则仅拦截/重定向HTML链接,否则您需要注意为CSS或图像文件设置正确的响应标头。

.htaccess的示例

该目录必须位于该书的ROOT文件夹中

1
2
3
4
<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteRule    ^(.*html)$    http://[FULL_LINK_TO_CAKE_APP]/proxy/load/$1
</IfModule>

代理控制器的示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
namespace App\\Controller;

/**
 * Static content controller
 *
 * This controller will render a html file
 *
 */

class ProxyController extends AppController
{

    public function load($file=null){
        if( !$file ){
            return $this->response->body("Error: no file specified" );
        }

        //THIS NEEDS TO RESOLVE THE FULL DISK PATH OF YOUR PROTECTED FILES
        $pathToFiles = WWW_ROOT . '/subfolder/';

        if( file_exists( $pathToFiles . $file )){
            $this->response->body( file_get_contents( $pathToFiles.$file) );
            return $this->response;
        }

        $this->response->body('Could not load the file: ' . $pathToFiles . $file);
        return $this->response;
    }
}

安全

当然我认为您已经在AppController中正确设置了Auth组件,因此,只有在用户登录后,上方的控制器才会执行!