如何将共享主机根重写到公用文件夹并将/public重定向回根目录?

How to rewrite shared hosting root to the public folder and redirect /public back to the root?

提问人:Gavo 提问时间:9/8/2023 最后编辑:Gavo 更新时间:9/11/2023 访问量:104

问:

我有一个 Laravel 项目,它已从自定义 VPS 转移到共享主机。

从root到公众重写所有内容是容易的部分。

但是当我转到 domain.com/public 页面时,可以工作......

那么我如何将域根重写为公众,但将直接访问 domain.com/public 重定向回 domain.com/?

免責聲明: 有很多关于 Laravel 的线程,并重写到公共文件夹。但没有人按预期工作。

Laravel .htaccess 重定向 mod-rewrite public

评论

0赞 Tpojka 9/8/2023
请注意这种配置:当一切都设置好并按您想象的工作时,检查是否可以从客户端/浏览器访问。其中 example.com 是您的任意域。https://www.example.com/.env
0赞 Jason Aller 9/8/2023
如果您编辑这是一个问题,您可以发布您对该问题的答案。将看似答案的内容作为问题发布会让一些人感到困惑。
1赞 Gavo 9/10/2023
@Tpojka,我尝试将 index.php 公开重命名为_index.php以尝试配置。根目录中的文件无法访问,因为所有文件都是强制公开的。但我得到了你的提示。当我访问域根目录时,我得到了禁止的响应。当我尝试访问根目录中的某些内容时,我得到了 404(因为不在公共文件夹中..)所以我认为这按预期工作。

答:

0赞 user83129 9/9/2023 #1

由于大多数共享主机不允许您更改主域的目录,因此这是一个常见问题。使用 Laravel 时,必须将域指向公用文件夹。

虽然有可能,但请注意,使用此解决方案,如果应用程序要更新,您将遇到安全问题,正如@Tpojka所指出的那样,您可能会面临泄露机密的风险,例如从您的 .env 文件中泄露机密。

此答案中描述的更好的解决方案是将 Laravel 应用程序目录移动到其他地方,然后复制或符号链接公共/文件夹内容。这样,应用程序的实际文件就无法公开访问。您需要确保是否需要符号链接存储/将其移动到正确的文档根目录。

0赞 Gavo 9/10/2023 #2

我找到了解决方案,所以我想与他人分享。

这必须位于根目录中。 公共目录 .htaccess 文件必须是 emtpy。

像其他人在这里评论一样。设置完成后,您需要检查您的敏感文件(如.env)是否不可见。

尝试 domain.com/.env,如果您没有获得 .env 文件,那就好了。


<IfModule mod_rewrite.c>
# That was ONLY to protect you from 500 errors
# if your server did not have mod_rewrite enabled


    RewriteEngine On

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

    # Prevent direct access to the "public" folder - redirect to root
    RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /public/
    RewriteRule ^public/(.*) /$1 [R=302,L]

    #RewriteRule ^public/(.*)$ /$1 [R=302,L]


    # Redirect Trailing Slashes If Not A Folder...
    # - but look for the file in the "public" folder
    #   (ensure we are not already in the "public" folder)
    RewriteCond %{REQUEST_URI} !^/public/
    RewriteCond %{DOCUMENT_ROOT}/public/$1 !-d
    RewriteRule ^(.*)/$ /$1 [R=302,L]

    # Rewrite "everything" to the "public" subdirectory if not already
    # This ignores existing files/dirs in the document root
    RewriteCond %{REQUEST_URI} ^/(.*)
    RewriteRule !^public/ public/%1 

    # Handle Front Controller... (as before)
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]


</IfModule>