htaccess - 检查HTML中的原始URL是否包含`../`

时间:2017-11-20 12:29:44

标签: php apache .htaccess mod-rewrite

我有一个看起来像的目录树:

public_html
    _COMMON
        INIT.php
    project-1
        index.php
    project-2
        index.php

这两个项目使用_COMMON中的文件。首先,他们通过index.php中的以下代码加载一些配置:

require_once '../_COMMON/INIT.php';

之后,他们通过以下方式使用公共资源:

<script src="../_COMMON/node_modules/jquery/dist/jquery.min.js"></script>

我有两个域名。它们都连接到同一台服务器,这意味着它们都提供相同的文件。我想从:

服务项目1
http://example.com/project-1/

http://project1.com/

为此,我使用以下htaccess将project1.com网址重写为project1.com/project-1/

RewriteCond %{HTTP_HOST} ^(?:www\.)?project1.com$
RewriteCond %{REQUEST_URI} !/project-1
RewriteRule ^(.*)$ /project-1/$1 [L,NC,QSA]

问题来了。

require_once部分有效,因为在重写请求网址后,INIT.php的网址已解析,这意味着:

  1. 用户访问http://project1.com/
  2. 网址已重写为http://project1.com/project-1/
  3. 执行http://project1.com/project-1/index.php
  4. http://project1.com/project-1/index.php已将../_COMMON/INIT.php解析为http://project1.com/_COMMON/INIT.php
  5. 但是,脚本未成功加载。我想这是因为在重写URL之前,浏览器会解析jquery.min.js的URL。我想以下情况会发生:

    1. 用户访问http://project1.com/
    2. 提供了
    3. http://project1.com/project-1/index.php,但网址为http://project1.com/
    4. 浏览器看到../_COMMON/node_modules...并尝试解决它
    5. 浏览器发起http://project1.com/_COMMON/node_modules/jquery/dist/jquery.min.js
    6. 请求
    7. 网址被重写为http://project1.com/project-1/_COMMON/... 并且不存在
    8. 我尝试了什么

      我可以添加一下:

      RewriteCond %{REQUEST_URI} !/_COMMON
      

      到我的htaccess并完成。

      但是,这是一种俗气的解决方案。如果project-1使用根目录下另一个目录中的文件,该怎么办?在htaccess中添加所有这些目录似乎很愚蠢。如果网址不包含_COMMON,我就不需要重写网址,如果它没有上传目录树,我需要重写网址,I.E。如果它包含../有没有办法检测到它?

      基本上,我想要的是重写以../开头的网址。我试过了:

      RewriteCond %{REQUEST_URI} !\.\./
      

      但它不起作用。我猜是因为../已在浏览器中解析,因此它不在htaccess实际处理的网址内。 还有其他方法可以检测原始网址是否包含../

0 个答案:

没有答案