如何使用 Mod Rewrite 访问非文档根文件夹文件?

如何使用 Mod Rewrite 访问非文档根文件夹文件?

我的网站代码结构如下/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,但我很难做到这一点。

我尝试.htaccess在 Laravel 框架提供的默认规则中添加一条规则。当前规则.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”。我感觉我可能错过了一些将“files”文件夹公开的设置,但我不知道该怎么做。

我陷入困境,如果有人能帮助我,我将不胜感激。

答案1

您可以创建一个符号链接

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

您需要Options +FollowSymLinks此功能才能工作。请注意,此选项会增加安全风险,因为它允许访问 之外的文件DocumentRoot

或者,您可以添加到此站点的配置Alias /files /var/www/html/filesVirtualHost。这是一个更安全的选项,但您不能使用 来执行此操作.htaccess

答案2

除了@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)

相关内容