使用htaccess

时间:2015-05-28 05:00:16

标签: .htaccess mod-rewrite laravel laravel-routing

设置

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

public_html/myapp/

我希望通过以下网址访问它:

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

我已创建此.htaccess规则并将其放在myapp文件夹中以重定向请求:

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

问题:

在我的浏览器中,当我尝试访问该应用时,我获得了重定向的网址,如:

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

而不是漂亮的漂亮网址,如:

  • 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>

4 个答案:

答案 0 :(得分:10)

您可以使用符号链接

  1. 将您的laravel应用程序放在其他位置(在public_html文件夹之外)
  2. 在public_html文件夹中创建应用程序公共文件夹的符号链接

    cd / path / to / your / public_html

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

  3.   

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

答案 1 :(得分:4)

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

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

您还应修改.htaccess目录中的myapp/public,如下所示:

<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/

答案 2 :(得分:0)

此示例适用于以下情况:

请按照以下步骤操作:

  1. 将所有内容从 myapp / public 文件夹移至 myapp / 文件夹
  2. 打开 myapp / index.php 并将引导路径更新为 require __DIR __。'/ bootstrap /
  3. 打开.env并更新到您的基本网址,例如: APP_URL = http://example.com/myapp
  4. 更新所有视图和布局中的路径(如果有的话,也在代码中)以使用基本URL,如下所示: 的 SRC = “{{URL ::到( '/ JS / app.js')}}”
  5. 始终建议将公用文件夹与应用的其余部分分开。您可以通过在其中添加包含“拒绝所有”的.htaccess文件为Laravel文件夹添加一些保护。

答案 3 :(得分:0)

我遇到了同样的问题,但是使用 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>