我的网站代码结构如下/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/files
中VirtualHost
。这是一个更安全的选项,但您不能使用 来执行此操作.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)
)