在子目录中使用htaccess安装Laravel 5应用程序

21

设置

我正在尝试在服务器上的此目录中安装Laravel 5应用:

public_html/myapp/

我希望可以通过以下URL访问它:

http://www.example.com/myapp/

我已创建了这个.htaccess规则并将其放置在myapp文件夹中,以便重定向请求:

RewriteEngine on
RewriteRule ^(.*)$ public/$1 [L]

问题:

在我的浏览器中,当我尝试访问应用程序时,我会被重定向到以下URL:

  • http://www.example.com/myapp/public/index.php
  • http://www.example.com/myapp/public/index.php/dashboard

而不是像下面这样漂亮的URL:

  • http://www.example.com/myapp/
  • http://www.example.com/myapp/dashboard

我需要在我的.htaccess文件中做出哪些改变才能使正确的URL起作用?


更新:Laravel应用程序可以移动到其他地方,只要可以实现上述期望的URL结构(应用程序可在example.com/myapp/处访问)。

更新:当我尝试访问example.com/myapp/dashboard时,浏览器会显示以下错误信息:NotFoundHttpException in compiled.php line 7793:堆栈跟踪从以下位置开始:

in compiled.php line 7793
at RouteCollection->match(object(Request)) in compiled.php line 7066
at Router->findRoute(object(Request)) in compiled.php line 7038
at Router->dispatchToRoute(object(Request)) in compiled.php line 7030
at Router->dispatch(object(Request)) in compiled.php line 1989
at Kernel->Illuminate\Foundation\Http\{closure}(object(Request))

更新:以下的.htaccess文件位于公共文件夹中:

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On

    # Redirect Trailing Slashes...
    RewriteRule ^(.*)/$ /$1 [L,R=301]

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

</IfModule>

你的public文件夹中也有.htaccess文件吗? - kamlesh.bar
将应用程序安装在public_html目录下,会让所有Laravel文件对所有人都可访问,不安全吗? - Mahozi
嗯,可能是这样的。如果我安装在public_html之外,我该如何用.htaccess指向它呢?(只要能实现我希望的URL结构,我也会接受这个作为有效答案) - Ben Cole
@BenCole 你最终是如何设置应用程序的?你使用了 .htaccess 文件吗? - atefth
4个回答

14
您可以使用符号链接进行操作。
  1. 将您的laravel应用程序放置在其他位置(public_html文件夹之外)
  2. 在public_html文件夹中创建应用程序公共文件夹的符号链接

    cd /path/to/your/public_html

    sudo ln -s /path/to/your/laravel_app/public myapp

您可以在此处阅读更多有关符号链接的信息。


8

您可以通过在myapp文件夹中添加额外的.htaccess文件来轻松实现此目标(这将重定向myapp文件夹中所有请求到public,因为这是应该的):

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteRule ^(.*)$ public/$1 [L]
</IfModule>

您还需要修改位于myapp/public目录中的.htaccess文件,如下所示:
<IfModule mod_rewrite.c>
    Options -MultiViews
    RewriteEngine On    
    RewriteBase /myapp/

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule . index.php [L]
</IfModule>

这里的变化在于您需要重写基础路径 RewriteBase /myapp/

我似乎仍然遇到同样的问题。重写规则对于纯文本文件确实有效,但是当我尝试访问index.php时,我会像最初描述的那样被重定向。如果有帮助弄清楚发生了什么,我将在原始问题中更新一个我注意到的错误消息。 - Ben Cole
请从公共文件夹中删除您的.htaccess文件,并将我建议的文件替换上去。 - Sh1d0w
我已经用提供的文件替换了 myapp/public/.htaccess 文件,并且也将 "myapp" 替换为应用程序文件夹的名称。为了确保,我还清除了浏览器缓存。但是重定向问题仍然存在。你提供的重写规则看起来很好,所以也许应用程序中的路由有其他问题?我不太确定。 - Ben Cole
请在您的问题中提供routes.php文件的内容。 - Sh1d0w
1
顺便提一下,在此之前请运行 php artisan clear-compiled - Sh1d0w

2
我遇到了同样的问题,但是通过使用RewriteBase参数,我成功解决了它。
这是我的 .htaccess 文件内容:
<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On
    RewriteBase /my_app/

    # Redirect Trailing Slashes...
    RewriteRule ^(.*)/$ /$1 [L,R=301]

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

-2

这个例子适用于以下情况:

按照以下步骤操作:

  1. myapp/public文件夹中的所有内容移动到myapp/文件夹中
  2. 打开myapp/index.php并更新引导路径为require __DIR__.'/bootstrap/'
  3. 打开.env文件并更新基本URL,例如:APP_URL=http://example.com/myapp
  4. 在所有视图和布局中更新路径(如果有代码也要更新)以使用基本URL,例如: src="{{URL::to('/js/app.js')}}"

建议将公共文件夹与应用程序的其余部分分开。您可以通过在其中添加包含“Deny from all” 的 .htaccess 文件来为 Laravel 文件夹添加一些保护。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接