我是整個 apache 配置的新手,我有一個問題,我似乎無法在谷歌上找到解決方案。
簡而言之,我無法從 URL 隱藏檔案夾,因為它看起來好像檔案根字符 (^) 從我的 XAMPP 安裝檔案夾的開頭開始 -/opt/lampp/htdocs/batulabe/
詳細我已經在我的 mac 上安裝了一個新的 XAMPP VM,沒有進行太多配置,所以一切基本上都是默認的。這是網站的當前檔案夾布局:
-batulabe (the document root I intend to make, this folder is inside htdocs)
--public
---pages
----*php pages
--private
---*private, inaccessible files
我正在嘗試重寫 URL,例如:
http://localhost/batulabe/public/pages/varpage.php
至
http://localhost/batulabe/varpage
結果我得到
http://my_ipv4_address/opt/lampp/htdocs/batulabe/public/pages/public/pages/account.php.php
我創建了一個.conf名為的額外檔案website.conf,并通過撰寫如下所示的一行讓 Apache 讀取它 - Include "/opt/lampp/apache2/conf/website.conf". 除此之外,這些是我更改的唯一檔案(.conf):
-httpd.conf
Alias /bitnami/ "/opt/lampp/apache2/htdocs/"
Alias /bitnami "/opt/lampp/apache2/htdocs"
<Directory "/opt/lampp/apache2/htdocs">
Options Indexes FollowSymLinks
LoadModule rewrite_module modules/mod_rewrite.so
AllowOverride All
Order allow,deny
Allow from all
</Directory>
-website.conf(我為 Apache 制作的相同的額外組態檔)
<Directory "/opt/lampp/htdocs/batulabe">
Options -Indexes
Require all granted
ErrorDocument 403 /batulabe/index.php
</Directory>
<Directory "/opt/lampp/htdocs/batulabe/private">
<LimitExcept POST>
Require all denied
</LimitExcept>
</Directory>
為了節省重新啟動 Apache 的時間,我的重寫是臨時寫入的.htaccess(它存盤在網站根檔案夾的“/batulabe”中)。里面是這樣的:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^(.*)$ public/pages/$1.php [R=301,L]
</IfModule>
該標志[R=301]幫助我了解為什么(可能?)到目前為止,以前的重寫組合都沒有作業,這是因為^結果http://my_ipv4_address/opt/lampp/htdocs/batulabe/不是http://my_ipv4_address/batulabe/或至少沒有網站檔案夾“/batulabe”,因為一切都是默認安裝的。
任何幫助是極大的贊賞!
uj5u.com熱心網友回復:
為什么要使用R=301標志實作外部重定向?這不是你想要的,你想要的是內部重寫。所以去掉那個標志!
也RewriteCond沒有真正的意義。您測驗請求的路徑是否指向檔案系統中的物理檔案。但考慮到您想將請求重寫到其他檔案夾,這很可能不是這種情況。相反,您必須檢查重寫的路徑是否指向檔案。
在您發布的代碼片段中,您的實際DOCUMENT_ROOT檔案夾在配置中的定義存在一些差異。您在不同的檔案中使用不同的路徑:/opt/lampp/apache2/, /opt/lampp/apache2/htdocs/, /opt/lampp/htdocs/... 修復該問題。它只是其中之一。
最后同樣重要的是,您應該將該分布式組態檔(“.htaccess”)放在DOCUMENT_ROOThttp 主機的實際檔案夾中。請在您的配置中檢查。原因是您想稍后將規則移動到 http 服務器的主機配置中(這是我從您的措辭中理解的“我的重寫是臨時撰寫的”......
這是一種應該為您指明正確方向的方法:
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/batulabe/public/pages/
RewriteRule ^/?batulabe/(.*)$ /batulabe/public/pages/$1.php [L]
一般來說,您應該更喜歡將這些規則放在實際的 http 服務器的主機配置中,而不是使用分布式組態檔。原因之一是避免在路徑的不同處理上增加復雜性和混淆。
當然可以像您所做的那樣,在存盤在層次結構更下方的檔案夾中的組態檔中實作規則。那應該作業:
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/public/pages/
RewriteRule ^(.*)$ public/pages/$1.php [END]
但請注意,將這些規則移至中央配置時,您必須再次更改這些規則。此外,您還冒著與您在層次結構中某處實施的其他規則發生更多意外互動的風險。這就是為什么根據我的經驗,人們通常應該避免這種方案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/526814.html
