所以我想从子文件夹加载 Web 应用。当前配置如下
<VirtualHost *:80>
ServerName YOUR IP ADDRESS/DOMAIN
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html/
<Directory /var/www/html/monica/public/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
# Everything under this line has been added by me to try to make the redirect work
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /var/www/html/monica/public/$1 [R]
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
页面被正确提供,但由于文件包含绝对 URL,它一直失败。我对 Apache 还很陌生,所以我不知道我做错了什么,寻找答案也是徒劳的。
如果我创建 DocumentRoot/var/www/html/monica/public/
它可以正常工作,但我想从子目录访问它,例如localhost/monica/
注意:此 Web 应用程序可从基础 (https://github.com/monicahq/monica/)
答案1
我认为我明白你现在指的是什么了(尽管引用资产的示例“绝对路径”会很有用)。我假设你引用的资产类似于/img/image.jpg
(或https://example.com/img/image.jpg
)?而实际资源位于/monica/public/img/image.jpg
?所以,你基本上需要将所有 URL(对于静态资产)重写到/monica/public
子目录中。但这是否也会影响你的页面间 URL?(除非你只使用相对的页面之间的 URL?)
例如,<Directory>
尝试以下操作来替代现有的块。请注意,Directory
路径引用的是您的文档根目录。
<Directory /var/www/html>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.+\.(?:jpg|png|css|js))$ /monica/public/$1 [L]
</Directory>
检查文件扩展名(静态资产)的目的是为了避免“文件存在”检查每一个请求(相对而言昂贵的)。
这假设您有一个.htaccess
位于/monica/public/.htaccess
(如文件结构所示)的文件,然后该文件会路由请求。(否则,如果资产确实不存在,这可能会导致重写循环。)
如果我创建 DocumentRoot
/var/www/html/monica/public/
它可以正常工作,但我想从子目录访问它,例如localhost/monica/
但是,这听起来像您应该“修复”您的 URL 路径(Laravel 内的路由)而不是重写您的资源?
更新:
你能告诉我该怎么做吗?
我不确定,这似乎是 Laravel/PHP 的问题?文档根目录是/var/www/html/monica/public/
(文件系统路径),但您想有效地从/monica
子目录中提供内容URL 路径。请注意,中的“monica”/var/www/html/monica/public/
与 URL 中的“monica”不同。您可以将 Web 应用程序放在/monica
文件系统的子目录中(因此绝对文件系统路径将是/var/www/html/monica/public/monica
),或者将 Web 应用程序中的所有 URL 更改为包含/monica/
在 URL 路径的开头。
不管你如何做,你的 webapp 中的所有 URL (包括静态资源和所有内容) 都需要以 开头/monica
。所以,除了在 Laravel 中修改路由之外,我看不出还有其他方法。
Apache 可以帮助移动通过发出外部重定向将内容从文档根目录重定向到/monica
子目录。但这只是为了 SEO 的好处,而不是供您的用户一直使用(速度更慢、服务器负载增加等)。
如果我将其更改为此...资产将再次停止加载。你知道原因吗?
<Directory /var/www/html/monica> Options Indexes FollowSymLinks AllowOverride All Require all granted RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteRule (.+\.(?:jpg|png|css|js))$ /public/$1 [L] </Directory>
因为(如果我回答开始时的假设仍然正确的话)您正在引用您的资产,例如/img/image.jpg
和 而不是/monica/img/image.jpg
。