Apache 将 Absolue url 重定向到相对 url

Apache 将 Absolue url 重定向到相对 url

所以我想从子文件夹加载 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

相关内容