Laravel 部署在子文件夹上的应用路由失败
Routing fail on Laravel app deployed on subfolder
好的,这就是正在发生的事情。
我已经创建了一个小 laravel 应用程序(实际上,它仍处于开发阶段)。
当我将其上传到服务器(通过 cPanel 管理的共享主机)时,我已将其部署到主网站内的子文件夹中。
服务器的 public_html 文件夹中有主网站(一个 WordPress),因此我创建了一个子文件夹,用于放置我的应用程序。
现在,当您请求 http://oursite.com 时,您会到达 Wordpress 站点。
当您请求 http://oursite.com/laravelapp 时,您会到达 laravel 应用程序的初始页面。
但是,当我尝试在应用程序中浏览任何页面时,路由 returns 我到根 Web 文件夹内的路由。
例如,如果我按下登录按钮,请求 http://oursite.com/laravelapp/login redirects to http://oursite.com/login,显然,页面加载失败
有趣的是,如果我直接到达 public 页,它似乎工作正常。
如果我直接请求 http://oursite.com/laravelapp/public/index.php and push the same login button, a request to http://oursite.com/laravelapp/public/index.php/login 就成功了!!甚至 JS 和 CSS 链接都在该请求上被正确检测到!
我怀疑这可能是非常愚蠢的事情,我现在看不到,因为我太累了,但我真的很感激任何对此事的见解。
我的 laravelapp 文件夹中的 index.php 如下:
<?php
/**
* Laravel - A PHP Framework For Web Artisans
*
* @package Laravel
* @author Taylor Otwell <taylor@laravel.com>
*/
$uri = urldecode(
parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH)
);
// This file allows us to emulate Apache's "mod_rewrite" functionality from the
// built-in PHP web server. This provides a convenient way to test a Laravel
// application without having installed a "real" web server software here.
if ($uri !== '/' && file_exists(__DIR__.'/public'.$uri)) {
return false;
}
require_once __DIR__.'/public/index.php';
这是 /laravelapp/public 文件夹中的 .htaccess 文件的代码:
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews -Indexes
</IfModule>
RewriteEngine On
# Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^ %1 [L,R=301]
# Handle Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
</IfModule>
也许我可以使用像 myLaravelApp.oursite.com 这样的子域来解决这个问题?
好的。
我解决了这个问题,将 laravelApp/public 上的 .htaccess 复制到 laravelApp。
根文件夹似乎需要某种类型的重定向,这非常有效。
好的,这就是正在发生的事情。
我已经创建了一个小 laravel 应用程序(实际上,它仍处于开发阶段)。
当我将其上传到服务器(通过 cPanel 管理的共享主机)时,我已将其部署到主网站内的子文件夹中。
服务器的 public_html 文件夹中有主网站(一个 WordPress),因此我创建了一个子文件夹,用于放置我的应用程序。
现在,当您请求 http://oursite.com 时,您会到达 Wordpress 站点。 当您请求 http://oursite.com/laravelapp 时,您会到达 laravel 应用程序的初始页面。
但是,当我尝试在应用程序中浏览任何页面时,路由 returns 我到根 Web 文件夹内的路由。
例如,如果我按下登录按钮,请求 http://oursite.com/laravelapp/login redirects to http://oursite.com/login,显然,页面加载失败
有趣的是,如果我直接到达 public 页,它似乎工作正常。
如果我直接请求 http://oursite.com/laravelapp/public/index.php and push the same login button, a request to http://oursite.com/laravelapp/public/index.php/login 就成功了!!甚至 JS 和 CSS 链接都在该请求上被正确检测到!
我怀疑这可能是非常愚蠢的事情,我现在看不到,因为我太累了,但我真的很感激任何对此事的见解。
我的 laravelapp 文件夹中的 index.php 如下:
<?php
/**
* Laravel - A PHP Framework For Web Artisans
*
* @package Laravel
* @author Taylor Otwell <taylor@laravel.com>
*/
$uri = urldecode(
parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH)
);
// This file allows us to emulate Apache's "mod_rewrite" functionality from the
// built-in PHP web server. This provides a convenient way to test a Laravel
// application without having installed a "real" web server software here.
if ($uri !== '/' && file_exists(__DIR__.'/public'.$uri)) {
return false;
}
require_once __DIR__.'/public/index.php';
这是 /laravelapp/public 文件夹中的 .htaccess 文件的代码:
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews -Indexes
</IfModule>
RewriteEngine On
# Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^ %1 [L,R=301]
# Handle Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
</IfModule>
也许我可以使用像 myLaravelApp.oursite.com 这样的子域来解决这个问题?
好的。
我解决了这个问题,将 laravelApp/public 上的 .htaccess 复制到 laravelApp。
根文件夹似乎需要某种类型的重定向,这非常有效。