Dot-Htaccess

如何使用 Mod Rewrite 訪問非文件根文件夾文件?

  • December 31, 2021

我的網站程式碼具有以下結構/var/www/html

-- files
---- test.txt

-- app
---- SomePhpCodes.php
---- SomePhpCodes.php

-- public
---- index.php
---- .htaccess

文件根目錄設置為“/var/www/html/public”,但我也希望通過路徑“http://mywebsite/files/test.txt”訪問文件。

.htaccess我認為在裡面的文件中使用 mod_rewrite 必須是可能的,public但我正在努力這樣做。

我嘗試向.htaccessLaravel 框架提供的預設規則添加一個規則。電流.htaccess如下所示:

<IfModule mod_rewrite.c>
   <IfModule mod_negotiation.c>
       Options -MultiViews -Indexes
   </IfModule>

   RewriteEngine On

   # Handle Authorization Header
   RewriteCond %{HTTP:Authorization} .
   RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

   # Redirect Trailing Slashes If Not A Folder...
   RewriteCond %{REQUEST_FILENAME} !-d
   RewriteCond %{REQUEST_URI} (.+)/$
   RewriteRule ^ %1 [L,R=301]

   # The following rule is added by me
   RewriteRule files/(.*\.txt) /var/www/html/files/$1 [L]

   # Send Requests To Front Controller...
   RewriteCond %{REQUEST_FILENAME} !-d
   RewriteCond %{REQUEST_FILENAME} !-f
   RewriteRule ^ index.php [L]
</IfModule>

目前結果是Internal Server Error嘗試訪問“http://mywebsite/files/test.txt”時。我有一種感覺,我可能錯過了一些設置來公開“文件”文件夾,但我不知道該怎麼做。

我被困住了,如果有人可以幫助我,我將不勝感激。

您可以創建符號連結

ln -s /var/www/html/files /var/www/html/public/files

你將需要Options +FollowSymLinks這個工作。請注意,此選項會增加安全風險,因為它允許訪問DocumentRoot.

或者,您可以添加到此站點Alias /files /var/www/html/files的配置中。VirtualHost這是一個更安全的選擇,但您不能使用.htaccess.

除了@AlexD 的回答…

認為這必須可以在.htaccess文件中使用 mod_rewrite

這可以使用 mod_rewrite,但不能在.htaccess. 您需要直接在主伺服器配置(或 VirtualHost 容器)中執行此操作。

目錄(或.htaccess)上下文中,您只能重寫為 URL 路徑。但是,在伺服器(或虛擬主機)上下文中,您可以重寫為 URL 路徑絕對文件系統路徑。

但是,這不是您的原因Internal Server Error

RewriteRule files/(.*\.txt) /var/www/html/files/$1 [L]

這很可能導致重寫循環(因此 500 內部伺服器錯誤響應),因為未錨定RewriteRule 模式也匹配替換字元串(相對於根的 URL 路徑),因此重寫的 URL 路徑被一次又一次地重寫。 .

伺服器上下文中,您可以這樣編寫:

RewriteRule ^/files/(.+\.txt)$ /var/www/html/files/$1 [L]

(如果您不期望目錄的子目錄,/files則應該使正則表達式更具限制性,例如。([^/]+\.txt)

引用自:https://serverfault.com/questions/1088542