Laravel 用于另一个 fw 中的子部分时的索引路由问题(外部 public 目录)
Laravel index route issue when using for a subsection in another fw (external public dir)
我正在使用带有外部 public 目录的 Laravel 应用程序,例如root/Laravel
,和 root/html/public
。
我需要这个应用程序从 php 文件 (root/html/this-section.php
) 上的需求加载,该文件已经有另一个框架加载它,因此其他 fw 有自己的头,并且 body 标签。此应用程序将在该文件的 header 和页脚之间加载。
当我设置路线时,我注意到以下两条路线都有效,但我得到了不同的结果。
Route::get('/', 'HomeController@index');
Route::get('/this-section', 'HomeController@index');
# this also works as a substitute for above, still same issue though
Route::get('//', 'HomeController@index');
这些是相同的页面,控制器具有相同的代码,我希望页面加载相同。发生的事情是主索引 site.com/
加载正确,但后者加载时没有 this-section.php
上存在的 html <head>
和 <body>
标签。所以本质上,后者没有加载 parent 页面,它只加载它在 blade 模板上看到的内容。
我怀疑可能需要对 .htaccess 添加重写来解决这个问题,或者设置自定义重定向或 return 控制器中的视图或响应 (我需要在这里提供建议) 然后我可以在其中制作第二种方法,例如thisSectionIndex()
和 return 那个建议。
起初我有一些事情是将 public_path()
覆盖到正确的路径 this-section
但是当我制作子路线时适得其反
例如使用以下路线设置时
Route::get('/', 'HomeController@index');
Route::get('/feature', 'SectionController@feature');
它导致 feature
路由为 500 或 404,我认为它找不到文件,所以我意识到我需要 不幸的是 添加/this-section
路线的一部分,这几乎打开了一堆蠕虫。
Route::get('/', 'HomeController@index');
Route::get('/this-section', 'HomeController@index');
Route::get('/this-section/feature', 'SectionController@feature');
附带说明一下,我已经找到一个临时 work-around 的一些后果 {{assets()}}
坏了。我已将 assets()
覆盖为不必使用 this-section/
部分,例如像这样 {{assets(/this-section/css/styles.css)}}
。临时工作是 unfortunately
必须手动添加路径并放弃在 blade 模板中完全使用 {{assets()}}
直到我弄清楚那部分,因为现在没有路径适用于它们。
一些背景信息:
我正在像这样覆盖 public 路径
#Laravel\app\SectionApplication
class SectionApplication extends \Illuminate\Foundation\Application
{
public function publicPath()
{
$newBasePath = $this->basePath . DIRECTORY_SEPARATOR . '..' .
DIRECTORY_SEPARATOR . 'html/this-section';
return $newBasePath;
}
}
#Laravel/bootstrap/app.php
// $app = new Illuminate\Foundation\Application(
// realpath(__DIR__.'/../')
// );
$app = new App\SectionApplication(
realpath(__DIR__.'/../')
);
这是 laravel 引导程序索引 (html/this-section/index.php
)
的相关(调整后)部分
function public_path($path = '')
{
return realpath(__DIR__);
}
//adjust your relative laravel framework path here
$laravelRelPath = '../../Laravel';
//override the blade {{asset()}} helper
function asset($path, $secure = null)
{
$newPubPath = 'this-section/'; //relative from html where the index.php will be
return app('url')->asset($newPubPath . $path, $secure);
}
.htaccess 位于 Laravel 之外,在 html/
中
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>
RewriteEngine On
#Rewritebase /this-section/
#RewriteRule ^(.*)$ this-section/ [L]
# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
# Handle Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
# Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
</IfModule>
在this topic的帮助下
this topic 我找到了可行的解决方案。当您在应用程序中加载时需要进行调整。您希望从与文件加载 bootstrap 相同的路径 bootstrap 它,然后仅覆盖该特定路径的 .htaccess。
将laravels bootstrap文件html/this-section/index.php
文件上移一个目录,在文件html/this-section.php
旁边,并将其重命名为[=13] =]
通过删除一个目录 ../
调整 html/this-section-laravel-boostrap.php
上 laravel 的路径
- 例如从
$laravelRelPath = '../../Laravel';
到 $laravelRelPath = '../Laravel';
将以下代码添加到htlm/this-section.php
(文件加载bootstrap)
if (strpos($_SERVER['REQUEST_URI'],'this-section') !== false) {
require_once('this-section-laravel-bootstrap.php');
}
- 将以下内容添加到 .htaccess 以获取 uri
#Rewritebase /
RewriteRule ^this-section/?$ / [L,NC]
this-section
所需的唯一路线
Route::get('/this-section', 'HomeController@index')
- 在您的 blade 模板中,像这样调用您的资产,以便它们加载到每个子部分 url,例如css
<link rel="stylesheet" href="/this-section/css/styles.css">
应用程序现在 bootstrap,并始终使用加载它的 parent 文件中的外部内容。请参阅下面的示例 parent 测试文件 (html/this-section.php
)。
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Parent Application</title>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
</head>
<body>
<header>
<nav>
<ul>
<li>menu</li>
</ul>
</nav>
</header>
<?php
<--! laravel sandwich -->
if (strpos($_SERVER['REQUEST_URI'],'this-section') !== false) {
require_once('this-section-laravel-bootstrap.php');
}
?>
<footer>
<p>Copyright <?php echo date('Y'); ?> - All rights reserved.</p>
</footer> -->
</body>
</html>
奖金
资产现在正在正确加载,您可能不需要第 5 步。
{{asset('css/vendors.css')}}
我正在使用带有外部 public 目录的 Laravel 应用程序,例如root/Laravel
,和 root/html/public
。
我需要这个应用程序从 php 文件 (root/html/this-section.php
) 上的需求加载,该文件已经有另一个框架加载它,因此其他 fw 有自己的头,并且 body 标签。此应用程序将在该文件的 header 和页脚之间加载。
当我设置路线时,我注意到以下两条路线都有效,但我得到了不同的结果。
Route::get('/', 'HomeController@index');
Route::get('/this-section', 'HomeController@index');
# this also works as a substitute for above, still same issue though
Route::get('//', 'HomeController@index');
这些是相同的页面,控制器具有相同的代码,我希望页面加载相同。发生的事情是主索引 site.com/
加载正确,但后者加载时没有 this-section.php
上存在的 html <head>
和 <body>
标签。所以本质上,后者没有加载 parent 页面,它只加载它在 blade 模板上看到的内容。
我怀疑可能需要对 .htaccess 添加重写来解决这个问题,或者设置自定义重定向或 return 控制器中的视图或响应 (我需要在这里提供建议) 然后我可以在其中制作第二种方法,例如thisSectionIndex()
和 return 那个建议。
起初我有一些事情是将 public_path()
覆盖到正确的路径 this-section
但是当我制作子路线时适得其反
例如使用以下路线设置时
Route::get('/', 'HomeController@index');
Route::get('/feature', 'SectionController@feature');
它导致 feature
路由为 500 或 404,我认为它找不到文件,所以我意识到我需要 不幸的是 添加/this-section
路线的一部分,这几乎打开了一堆蠕虫。
Route::get('/', 'HomeController@index'); Route::get('/this-section', 'HomeController@index'); Route::get('/this-section/feature', 'SectionController@feature');
附带说明一下,我已经找到一个临时 work-around 的一些后果 {{assets()}}
坏了。我已将 assets()
覆盖为不必使用 this-section/
部分,例如像这样 {{assets(/this-section/css/styles.css)}}
。临时工作是 unfortunately
必须手动添加路径并放弃在 blade 模板中完全使用 {{assets()}}
直到我弄清楚那部分,因为现在没有路径适用于它们。
一些背景信息:
我正在像这样覆盖 public 路径
#Laravel\app\SectionApplication
class SectionApplication extends \Illuminate\Foundation\Application
{
public function publicPath()
{
$newBasePath = $this->basePath . DIRECTORY_SEPARATOR . '..' .
DIRECTORY_SEPARATOR . 'html/this-section';
return $newBasePath;
}
}
#Laravel/bootstrap/app.php
// $app = new Illuminate\Foundation\Application(
// realpath(__DIR__.'/../')
// );
$app = new App\SectionApplication(
realpath(__DIR__.'/../')
);
这是 laravel 引导程序索引 (html/this-section/index.php
)
function public_path($path = '')
{
return realpath(__DIR__);
}
//adjust your relative laravel framework path here
$laravelRelPath = '../../Laravel';
//override the blade {{asset()}} helper
function asset($path, $secure = null)
{
$newPubPath = 'this-section/'; //relative from html where the index.php will be
return app('url')->asset($newPubPath . $path, $secure);
}
.htaccess 位于 Laravel 之外,在 html/
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>
RewriteEngine On
#Rewritebase /this-section/
#RewriteRule ^(.*)$ this-section/ [L]
# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
# Handle Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
# Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
</IfModule>
在this topic的帮助下 this topic 我找到了可行的解决方案。当您在应用程序中加载时需要进行调整。您希望从与文件加载 bootstrap 相同的路径 bootstrap 它,然后仅覆盖该特定路径的 .htaccess。
将laravels bootstrap文件
html/this-section/index.php
文件上移一个目录,在文件html/this-section.php
旁边,并将其重命名为[=13] =]通过删除一个目录
调整../
html/this-section-laravel-boostrap.php
上 laravel 的路径- 例如从
$laravelRelPath = '../../Laravel';
到$laravelRelPath = '../Laravel';
- 例如从
将以下代码添加到
htlm/this-section.php
(文件加载bootstrap)
if (strpos($_SERVER['REQUEST_URI'],'this-section') !== false) {
require_once('this-section-laravel-bootstrap.php');
}
- 将以下内容添加到 .htaccess 以获取 uri
#Rewritebase /
RewriteRule ^this-section/?$ / [L,NC]
this-section
所需的唯一路线
Route::get('/this-section', 'HomeController@index')
- 在您的 blade 模板中,像这样调用您的资产,以便它们加载到每个子部分 url,例如css
<link rel="stylesheet" href="/this-section/css/styles.css">
应用程序现在 bootstrap,并始终使用加载它的 parent 文件中的外部内容。请参阅下面的示例 parent 测试文件 (html/this-section.php
)。
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Parent Application</title>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
</head>
<body>
<header>
<nav>
<ul>
<li>menu</li>
</ul>
</nav>
</header>
<?php
<--! laravel sandwich -->
if (strpos($_SERVER['REQUEST_URI'],'this-section') !== false) {
require_once('this-section-laravel-bootstrap.php');
}
?>
<footer>
<p>Copyright <?php echo date('Y'); ?> - All rights reserved.</p>
</footer> -->
</body>
</html>
奖金
资产现在正在正确加载,您可能不需要第 5 步。
{{asset('css/vendors.css')}}