[英]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.php
和dir-two/index.php
具有資源的相對路徑。
<link href="/styles/app.css" rel="stylesheet">
<script src="/scripts/app.js"></script>
因此,當我們訪問時,這些顯然會加載:
example.org/one-dir
但是在我們僅訪問以下情況下,它們將無法工作:
example.org
我們的php
需要該目錄,但現在所有相對路徑都已損壞。 為了解決這個問題,我考慮了.htaccess
和mod_rewrite
。
這些事情讓我心想:
我們能否以某種方式告訴apache,我們的資源在dir_one
或dir_two
中可用,取決於required
?
我們可以使用queries
,而不需要一個目錄,而可以通過.htaccess
文件告訴服務器向用戶顯示什么。 例如: example.org/?page=one
? dir_one/index.php
如果可能的話,我們將重寫它以顯示dir_one/index.php
呢?我們的資源現在可以使用嗎?我認為是...
但是如果我不想有任何可見的查詢參數,因為它只是一個目錄或另一個目錄(取決於情況),該怎么辦...所以這一次,我想到了設置可通過php
和我們的apache
設置的自定義headers
能夠訪問它們,對不對? 我真的希望如此……我的意思是,我讀過一個可以訪問它們的地方,但是我們可以從中讀取實際值還是僅檢查標頭是否存在?
因此,我們將root/index.php
文件內容更改為:
<?php
$case = $determine ? 'dir-one' : 'dir-two';
header("C-Load: $case");
?>
現在,我希望實現的功能與query
參數相同,但是在這種情況下,如果存在標頭,則從自定義header
讀取值,情況將始終如此。 根據確定結果,該值為dir-one
或dir-two
。
我沒有.htaccess
真正知識,我只能做一些基本的事情,但是我現在要使用稱為Google的鏟子進行挖掘,我真的希望我能自己解決一些問題。 哎呀,我什至沒有測試如果我們使用RewriteCond
和RewriteRule
顯示一個目錄或另一個目錄, 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:
另一個更新...我剛剛意識到,也許我無法在自己的服務器中執行此操作。 因此,我已經使用Postman
將GET
請求發送到帶有X-Load-Directory
上面提到的自定義標頭的我自己的本地主機,在這種情況下,它確實起作用。 它實際上是在該標頭上拾取的,這意味着我無法從php設置該標頭,然后從htaccess
對其進行訪問。 是的,從邏輯上講,當我考慮到這個順序時,這個順序毫無意義。
我已經研究了一段時間,我發現了一個非常簡單的帶有html
標簽的解決方案,它可以工作...
在我們的dir-one/index.php
和dir-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
這些相對路徑時,它們就可以正常工作。
但是,我仍然希望從我的問題中找出另外兩種方式。
使用.htaccess
解析它,並query
字符串以確定要作為根目錄加載的目錄。
使用.htaccess
和自定義headers
解析它,以確定將哪個目錄作為根目錄加載。
原因可能是在這兩種情況下,我可以避免從任何目錄訪問相對路徑資源,而這會神奇地起作用嗎? 😫
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.