使用自定义标头,而不是查询参数来重写URL

时间:2018-03-31 15:23:17

标签: php apache .htaccess

我一直在集思广益,解决一个问题,我真的想为个人项目目的而实现。现在,我相信我会谈论的这样的事情是可能的,但我无法在谷歌上挖掘任何东西。因此,要么没有人需要做这样的事情,要么就没有人想过要测试它,至少要有趣。 要了解我现在想到的所有内容,我将首先简单地设置我们的虚假域名和假项目结构。

域名

example.org

结构:

root/
├── dir-one/
│   ├── scripts/
│   ├── styles/
│   └── index.php
├── dir-two/
│   ├── scripts/
│   ├── styles/
│   └── index.php
└── index.php

我们正在运行apache服务器并使用php作为服务器端语言。

话虽这么说,我现在可以解释一下我们在这里有什么。 让我们说,我们的根index.php文件只是requires一个或另一个目录,具体取决于某种方式确定的变量......

因此,root/index.php的内容看起来像这样:

<?php

$case = $determine ? 'dir-one' : 'dir-two';

require_once "$case/index.php";

?>

但是,dir-one/index.phpdir-two/index.php的内容具有资源的相对路径。

<link href="/styles/app.css" rel="stylesheet">
<script src="/scripts/app.js"></script>

所以当我们访问时,这些显然会加载:

example.org/one-dir

但他们不会在我们刚刚访问的案例中工作:

example.org

我们的php需要该目录,但我们所有的相对路径现在都已损坏。为了解决这个问题,我想到了.htaccessmod_rewrite

这些事情让我想到了:

  1. 我们能以某种方式告诉apache,我们的资源在dir_onedir_two内可用,具体取决于哪一个是required吗?

  2. 我们可以使用queries而不需要一个目录或另一个目录,我们可以通过.htaccess文件告诉我们的服务器向用户展示什么。例如:example.org/?page=one(如果可能的话,我们会重写以显示dir_one/index.php吗?我们的资源现在可以运作了吗?我想是这样的......

    < / LI>
  3. 但是,如果我不希望有任何可见的查询参数,因为它只有一个目录或另一个,具体取决于具体情况......所以这一次,我想到了设置我们可以通过headers设置自定义php,我们的apache可以访问它们,对吗?我真的希望如此...我的意思是,我读到了一个我们可以访问它们的地方,但是我们可以从中读取它的实际值,或者只是检查标题是否存在?

  4. 因此,我们正在将root/index.php文件内容更改为:

    <?php
    
    $case = $determine ? 'dir-one' : 'dir-two';
    
    header("C-Load: $case");
    
    ?>
    

    现在,我希望实现的内容与query参数相同,但在这种情况下,如果标题存在,则从自定义header读取值,这将始终是案件。根据确定结果,该值可以是dir-onedir-two

    我对.htaccess并不了解,我只能做基本的事情,但我现在要挖掘一下名为谷歌的铲子,我真的希望我可以自己解决一些问题。 。哎呀,如果我们使用relativeRewriteCond来显示一个目录或另一个,我甚至没有测试我们的RewriteRule路径是否有效。但如果可能的话,我确定我们也可以用header做到这一点...... 任何形式的帮助,指针,文章甚至解决方案都会受到赞赏。

    更新#1:

    在进一步挖掘之后,我还没有找到解决方案,但我认为我已接近......但是,出于某种原因,似乎我无法与%{HTTP:header}的价值进行比较?

    PHP

    <?php
    
    header("X-Load-Directory: one");
    
    ?>
    

    APACHE(.htaccess)

    RewriteCond %{HTTP:X-Load-Directory} ^one$
    RewriteRule ^$ /dir-one/index.php [L]
    

    就我而言,这应该工作得很好,但事实并非如此。它永远不会通过Cond

    更新#2:

    另一个更新......我刚刚意识到,我可能无法在自己的服务器中做这样的事情。所以我使用Postman向我自己的localhost发送GET请求,并使用上面提到的自定义标头X-Load-Directory,在这种情况下它确实有效。它实际上取决于该标头,这意味着我无法从php设置该标头,然后从htaccess访问它。是的,从逻辑上来说,当我想到它时,顺序就没有意义了。

1 个答案:

答案 0 :(得分:0)

我现在已经挖掘了一段时间,我发现了一个非常简单的html标签解决方案,这将有效...

在我们的dir-one/index.phpdir-two/index.php中,我们需要添加此标记并将href指定到相应的目录...

<base href="/dir-one/">

通过删除第一个正斜杠/ ...

来稍微调整我们的路径
<link href="styles/app.css" rel="stylesheet">
<script src="scripts/app.js"></script>
  

P.S。我不知道/styles/app.css是绝对路径,因为它以正斜杠开头。

现在,当我们require php时,这些相对路径就可以了。

但是,我仍然希望从我的问题中找出另外两种方法。

  1. 使用.htaccessquery字符串解析它以确定以root身份加载的目录。

  2. 使用.htaccess和自定义headers解析它以确定要以root身份加载的目录。

  3. 因为在这两种情况下,我可以避免从任一目录中触及相对路径资源,它会神奇地工作吗?