Apache 为 Laravel /public 重写
Posted
技术标签:
【中文标题】Apache 为 Laravel /public 重写【英文标题】:Apache rewrite for Laravel /public 【发布时间】:2013-03-08 01:40:24 【问题描述】:对此我很抱歉,但我的 htdocs 根目录有误,我无法更改。所以我必须让它在/public
文件夹中工作。
我使用普通的 Laravel .htaccess 文件进行以下重写:
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule ^(.*)$ index.php/$1 [L]
如果我打开http://kemtime2_neu.pr.domain.de/public
,我会被重定向到http://kemtime2_neu.pr.domain.de/public/http://kemtime2_neu.pr.domain.de/public/login
我该如何解决这个问题?
我很乐意让它在 http://kemtime2_neu.pr.domain.de/
上工作,但让它在 http://kemtime2_neu.pr.domain.de/public/
上工作就可以了。
【问题讨论】:
【参考方案1】:我部分解决了。如果我在根目录中有一个 .htaccess 而不是 /public
with
RewriteEngine On
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule ^(.*)$ /public/index.php/$1 [L]
我可以打开http://kemtime2_neu.pr.domain.de/login
,但图像和 css 仍然是错误的。我需要先检查文件是否存在于/public
中。我想这是new question。
【讨论】:
【参考方案2】:我使用这篇文章的 3 解决方案并且工作正常:
http://web.archive.org/web/20130320184846/http://forums.laravel.io/viewtopic.php?id=1258
解决方案 1 - 带有符号链接的备用安装路径。
这是首选的解决方案,通常是一个全方位的好主意。可以将您的应用程序安装到与 public_html/ 无关的文件夹,然后将 public 文件夹符号链接到 public_html/ 路径。
例如:
将您的应用程序安装到 /home/applications/mysite.com
假设您的 DocumentRoot 指向 /var/www/vhosts/mysite.com/httpdocs
从 mysite.com vhosts 文件夹中删除 httpdocs 文件夹,然后使用符号链接将两者连接起来:ln -s /home/applications/mysite.com/public /var/www/vhosts/mysite.com/httpdocs
解决方案 2 - .htaccess 与 mod_rewrite
此解决方案使您可以将 Laravel 放入您的公用文件夹,然后使用 .htaccess 文件将请求重定向到公用文件夹。此解决方案将您的应用程序和核心系统代码放入可公开访问的文件夹中。这不是我们鼓励您使用任何 PHP 框架做的事情。
步骤 1. 将 Laravel 放在你的文档根文件夹中。
第 2 步。将以下 .htaccess 文件放入您的文档根文件夹中。
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %REQUEST_URI !^public
RewriteRule ^(.*)$ public/$1 [L]
</IfModule>
第 3 步。确保您在 application/config/application.php 中手动设置“url”配置,否则 Laravel 将生成错误的 URL。确保您的每个环境都具有正确的 application.url 配置。有关特定于环境的配置的更多信息,请参阅:http://laravel.com/docs/install#environments
解决方案 3 - 将公用文件夹合并到安装根目录
此解决方案将您的应用程序和核心系统代码放入可公开访问的文件夹中。这不是我们鼓励您使用任何 PHP 框架做的事情。
将 public/ 文件夹的内容复制到 Laravel 安装文件夹中,然后将 index.php 文件中的这一行更改为:
require '../paths.php';
到
require 'paths.php';
请记住,任何捆绑包、库或其他类型的第三方代码都不得设计为可公开访问。
注意:同样重要的是要注意您的 bundles/ 和 public/bundles/ 目录现在会发生冲突。使用这种方法时,您可能不想使用 artisan 的 bundle:publish 任务,但不知道您的 bundle 要发布什么。
【讨论】:
你能解释一下答案吗?链接已损坏。 将 public/ 文件夹的内容复制到你的 Laravel 安装文件夹中,然后在你的 index.php 文件中更改这一行: require '../paths.php';要求'paths.php';请记住,任何捆绑包、库或其他类型的第三方代码都不得设计为可公开访问。以上是关于Apache 为 Laravel /public 重写的主要内容,如果未能解决你的问题,请参考以下文章
apache设置.htaccess rewriteRule与laravel
Laravel - 在 LAMP 堆栈上将 /public 设置为 root
Laravel 5.4 artisan 为 /public 的现有文件夹提供 htaccess / 和 Routes::get