簡體   English   中英

使用自定義標頭,而不是查詢參數來重寫URL

[英]Use custom header, instead of query params to rewrite URL

我一直在集思廣益,想解決一個我真的想出於個人項目目的而解決的問題。 現在,我相信這樣的事情是可能的,但我無法在Google上挖掘任何東西。 因此,至少沒有人需要做這樣的事情,或者沒有人想到甚至要對其進行測試,至少是為了好玩。 為了遍歷我現在腦海中的所有內容,我將首先設置偽造的域和偽造的項目結構。

域:

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如果可能的話,我們將重寫它以顯示dir_one/index.php呢?我們的資源現在可以使用嗎?我認為是...

  3. 但是如果我不想有任何可見的查詢參數,因為它只是一個目錄或另一個目錄(取決於情況),該怎么辦...所以這一次,我想到了設置可通過php和我們的apache設置的自定義headers能夠訪問它們,對不對? 我真的希望如此……我的意思是,我讀過一個可以訪問它們的地方,但是我們可以從中讀取實際值還是僅檢查標頭是否存在?

因此,我們將root/index.php文件內容更改為:

<?php

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

header("C-Load: $case");

?>

現在,我希望實現的功能與query參數相同,但是在這種情況下,如果存在標頭,則從自定義header讀取值,情況將始終如此。 根據確定結果,該值為dir-onedir-two

我沒有.htaccess真正知識,我只能做一些基本的事情,但是我現在要使用稱為Google的鏟子進行挖掘,我真的希望我能自己解決一些問題。 哎呀,我什至沒有測試如果我們使用RewriteCondRewriteRule顯示一個目錄或另一個目錄, relative路徑是否可以工作。 但是,如果可以的話,我敢肯定,我們也可以使用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:

另一個更新...我剛剛意識到,也許我無法在自己的服務器中執行此操作。 因此,我已經使用PostmanGET請求發送到帶有X-Load-Directory上面提到的自定義標頭的我自己的本地主機,在這種情況下,它確實起作用。 它實際上是在該標頭上拾取的,這意味着我無法從php設置該標頭,然后從htaccess對其進行訪問。 是的,從邏輯上講,當我考慮到這個順序時,這個順序毫無意義。

我已經研究了一段時間,我發現了一個非常簡單的帶有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>

PS我不知道/styles/app.css是絕對路徑,因為它以正斜杠開頭。

現在,當我們在php require這些相對路徑時,它們就可以正常工作。


但是,我仍然希望從我的問題中找出另外兩種方式。

  1. 使用.htaccess解析它,並query字符串以確定要作為根目錄加載的目錄。

  2. 使用.htaccess和自定義headers解析它,以確定將哪個目錄作為根目錄加載。

原因可能是在這兩種情況下,我可以避免從任何目錄訪問相對路徑資源,而這會神奇地起作用嗎? 😫

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM