我刚刚开始学习Laravel框架,我在路由方面遇到了问题。
唯一有效的路由是开箱即用地附加到 Laravel 的默认主路由。
我在 Windows 上使用 WAMP,它使用 PHP 5.4.3 和 Apache 2.2.22,我也启用了mod_rewrite,并从应用程序.php配置文件中删除了"index.php"以留下空字符串。
我创建了一个名为 User 的新控制器:
class User_Controller extends Base_Controller {
public $restful = true;
public function get_index()
{
return View::make('user.index');
}
}
我在应用程序/视图/用户/中创建了一个名为 index 的视图文件.php其中包含一些基本的 HTML 代码,并且在路由中.php我添加了以下内容:
Route::get('/', function () {
return View::make('home.index');
});
Route::get('user', function () {
return View::make('user.index');
});
在我的 Web 浏览器中访问根 ( http://localhost/mysite/public
( 时,第一个路由工作正常,但是当我尝试使用http://localhost/mysite/public/user
转到第二个路由时,我收到 404 未找到错误。为什么会这样?
在我的 Ubuntu LAMP 安装中,我通过以下 2 个更改解决了这个问题。
- 在 apache 服务器上启用mod_rewrite:
sudo a2enmod rewrite
。 - 编辑/etc/apache2/apache2.conf,更改/var/www 目录(这是我的主文档根目录(的"AllowOverride"指令:
AllowOverride All
然后重新启动 Apache 服务器:service apache2 restart
使用 WAMP 单击 wamp icon
-> apache
-> apache modules
-> scroll
并选中rewrite_module
。
重新启动加载模块rewrite_module
注意:启用"rewrite_module"后,服务器应用程序将自动重新启动
您是否尝试过检查是否
http://localhost/mysite/public/index.php/user
在工作吗?如果是这样,请确保所有路径的文件夹没有任何大写字母。我也有同样的情况,将字母转换为小写会有所帮助。
您是否尝试过将其添加到路由文件中而不是Route::get('user', "user@index")
?
@
之前的文本段,user
在这种情况下,会将页面定向到用户控制器,@
之后的文本段,index
,会将脚本定向到user
函数public function get_index()
。
我看到您正在使用$restful
,在这种情况下,您可以将Route
设置为 Route::any('user', 'user@index')
。这将处理POST
和GET
,而不是将它们分别写出来。
我在使用EasyPHP时遇到了同样的问题。 发现我必须在httpd.conf
的<Directory>
块中指定AllowOverride All
。 没有这个,Apache有时会忽略你的.htaccess
。
我的最终看起来像这样...
<Directory "D:/Dev">
Options FollowSymLinks Indexes
#### NEXT IS THE CRUCIAL LINE ####
AllowOverride All
Order deny,allow
Allow from 127.0.0.1
Deny from all
Require all granted
</Directory>
尝试将root/public/.htaccess
移动到root/.htaccess
,它应该可以工作
只需在终端中运行即可。
php artisan route:clear
路线
使用它们来定义不受控制器管理的特定路由。
控制器
当您想使用传统的 MVC 架构时,请使用它们
解决您的问题
不要将控制器注册为路由,除非需要控制器操作的特定"命名"路由。
无需为控制器操作创建路由,只需注册控制器:
Route::controller('user');
现在您的控制器已注册,您可以导航到http://localhost/mysite/public/user
,您的get_index
将运行。
您还可以一次性注册所有控制器:
Route::controller(Controller::detect());
好的,所以在这个问题上抨击了一天多一点之后......我起床做了我昨天应该做的事情,并调试了正在发生的事情!
Laravel在这里试图做的是将文件index.php
插入作为路由给出的路径的正前方。例如,如果您指定了一个Route::get('/account/create', ...,
并从浏览器上的localhost/laravel/authenticate/public/account/create
执行您的应用程序,那么 laravel 想要执行localhost/authenticate/public/index.php/account/create
,但要这样做......Apache需要看到通过/wamp/www/laravel/laravel/authentication/public
的请求(你的路径可能会有所不同,这取决于你的laravel应用程序的实际安装位置,但尾随public
是需要进行替换的地方(必须应用"RewriteRule"。
值得庆幸的是,laravel在应用程序的public
文件夹中的方便.htaccess
文件中提供了正确的重写规则。问题是,".htaccess"文件中的代码不适用于开箱即用的 WAMP 配置方式。造成这种情况的原因似乎是 muvera 在此线程顶部提出的问题——rewrite_module代码需要由 Apache 加载,然后RewriteRule
的东西才能工作。哎呀,这是有道理的。
没有意义的部分:简单地stopping
和restarting
Apache 服务不会接受 WAMP 使用您的 RewriteRule 做正确事情所需的更改——我知道,我尝试了很多次!
什么有效:进行muvera建议的更改(见线程顶部(以加载正确的模块。然后,重置整个Windows会话,从而将Apache完全从内存中转储出来。重新启动(重新加载(WAMP,瞧!修复有效,应用了正确的重写规则,亚达,亚达;从此我过上了幸福的生活。
好消息是:我现在对.htaccess
、RewriteRule
和httpd.conf
文件有了更多的了解。有一个很好的(性能(参数可以将逻辑从应用程序的public
.htaccess
文件中移出,并将其放入 Apache 'bin' 文件夹中 httpd.conf 的Directory ...
部分(特别是如果您有权访问该文件夹(。
public/.htaccess
中的RewriteBase
:
例如:
Options +FollowSymLinks
RewriteEngine On
RewriteBase /your/folder/public
尝试在 php.ini 中启用短 php 标签。WAMP通常会关闭它们,而Laravel需要它们。
你必须使用Laravel 5
命令 class User_Controller extends Controller {
public $restful = true;
public function get_index(){
return View('user.index');
}
}
和路线.php
Route::get('/', function()
{
return view('home.index');
});
Route::get('user', function()
{
return view('user.index');
});
视图和控制器的 Laravel 5 命令更改请参阅我之前遇到相同错误的文档
只需在终端中运行即可。
composer dump-autoload
<</div>
div class="answers"> 我认为您已经删除了 laravel 公共文件夹中的默认 .htaccess 文件。 上传文件应该可以解决您的问题。
简单的命令自动加载依赖项
composer dump-autoload
并且仍然得到您的一些重要文件丢失,所以去这里查看整个过程
https://codingexpertise.blogspot.com/2018/11/laravel-new.html
如果您通过 Homestead 使用流浪者,则可能是挂载共享文件夹时出错。看起来Vagrant从该文件夹中获取您的文件,并在启动时交换出主机上的实际文件,因此,如果出现错误,您实际上是在尝试从您第一次进行安装时访问Laravel安装(这就是为什么您只得到"家" - 这是在安装过程中生成的(。
可以通过 sshing 连接到 vm 并检查路由/web.php 文件以查看它是否确实是你的文件来轻松检查这一点。如果不是,请退出并vagrant halt
、vagrant up
并在启动时查找错误。
- 安装 .env 文件
- 配置
index.html
- 确保您有
.htaccess
-
sudo service apache2 restart
很可能是由于缓存问题
不起作用的主要问题是macOS中有mod_rewrite.so模块,在Apache配置的httpd.conf文件中未启用Linux,因此.htaccess可以工作。我已经通过取消注释该行来解决此问题:
# LoadModule rewrite_module libexec/apache2/mod_rewrite.so
从上面的httpdf.conf
行中删除#
。然后它将工作.
享受!
Route::get('/', function() {
return View::make('home.index');
});
Route::get('user', function() {
return View::make('user.index');
});
将上面更改为
Route::get('user', function() {
return View::make('user.index');
});
Route::get('/', function() {
return View::make('home.index');
});
您必须在路线末尾使用'/'(home/default)