由于 .htaccess 文件,Laravel 4 路由无法正常工作?

Posted

技术标签:

【中文标题】由于 .htaccess 文件,Laravel 4 路由无法正常工作?【英文标题】:Laravel 4 routing not working due to .htaccess file? 【发布时间】:2013-09-22 10:51:43 【问题描述】:

我在这里写下我的步骤和发现,这样你就可以看到我尝试了什么以及我得到了什么结果。任何建议都会受到欢迎。我关注了this answer中的cmets。

我正在运行 Laravel 4,在 Windows 7 机器上使用 XAMMP version 1.8.2 with php 5.4.19 and Apache 2.4.4,我只是仍在尝试启动并运行本地实例。

在我的情况下:http://localhost/sos/sos_public/ 是我的主屏幕,它可以工作,但是当我尝试访问 http://localhost/sos/sos_public/signup 时,我收到了这个错误:Symfony \ Component \ HttpKernel \ Exception \ NotFoundHttpException,这在网上已经讨论了很多,然后我发现GaryJ 说这可能是.htaccess 问题,所以我按照他的建议做了。

我的/app/routes.php 文件看起来像这样(我也试过在signup 前面加上/):

Route::get('signup', function()

    return 'hello!';
);     

Route::get('/', function()

    return View::make('hello');
);

第一:

只是为了一笑而过,看看/index.php/hello 是否有效。如果是这样,那就是.htaccess 问题。

http://localhost/sos/sos_public/index.php/signup 工作得非常好。所以这是一个.htaccess 问题。

我的.htaccess 文件如下所示:

<IfModule mod_rewrite.c>
    Options -MultiViews
    RewriteEngine On

    RewriteCond %REQUEST_FILENAME !-d
    RewriteCond %REQUEST_FILENAME !-f
    RewriteRule ^ index.php [L] 
</IfModule>

还有:

如果您正在运行 Apache 2.4,请注意自上次以来的更改 版本,关于 Require all grantedAllowOverride all 在一个 &lt;Directory /&gt;...&lt;/Directory&gt; 阻止您的虚拟主机。

我按照Dalton Gore 的建议在我的httpd.conf file 中添加了这个 - 得到了Symfony \ Component \ HttpKernel \ Exception \ NotFoundHttpException 错误(将此目录路径更改为/SOS/sos_publicC:/xammp/htdocs/SOS/sos_public/C:/xammp/htdocs/SOS/sos_public - 结果相同):

<Directory />
    AllowOverride none
    Require all denied
</Directory>
<Directory /SOS/sos_public>
    AllowOverride all
    Require all granted
</Directory>

下一步:

检查.htaccess 中的任何内容是否正常

我将dsjkdsfghk 添加到我的.htaccess 文件并立即出错,所以我知道我的.htaccess 文件正在被使用。

那么:

尝试删除 IfModule 条件。因为您可以访问 主机/虚拟主机,如果不是,您可以很快启用该模块 - 所以它 不需要对每个请求进行检查。同样,尝试将其移出 的.htaccess,并放入您的&lt;Directory /&gt;...&lt;/Directory&gt; 块中 vhost - 如果您的 .htaccess 中没有其他内容,则可以 也删了。

有一个空的.htaccess 文件导致我的浏览器中404 出现404 错误(http://localhost/sos/sos_public/ 仍然有效)。 从C:\xampp\htdocs\SOS\sos_public\ 中删除.htaccess 文件具有相同的结果。

那么:

试试:<VirtualHost *:80> DocumentRoot "/Users/amiterandole/Sites/laravelbackbone/public" ServerName laravelbackbone.dev <Directory /> AllowOverride all Require all granted </Directory> <IfModule mod_rewrite.c> Options -MultiViews RewriteEngine On RewriteCond %REQUEST_FILENAME !-f RewriteRule ^ index.php [L] </IfModule> </VirtualHost>

我做到了,就像阿米特一样,

我清空了我的htaccess 文件并尝试了上述方法,但现在什么也没有 似乎有效。

除了他的laravelbackbone.dev 指向他的Sites 文件夹根目录外,当我在浏览器中运行它们时,我在http://localhost/sos/sos_public/http://localhost/sos/sos_public/signup 上都得到了Error 400 - Bad request

我的httpd-vhosts.conf 文件如下所示:

<VirtualHost *:80> 
    DocumentRoot "C:/xammp/htdocs/SOS/sos_public" 
    ServerName sos.dev
    <Directory /> 
        AllowOverride all 
        Require all granted 
    </Directory> 
    <IfModule mod_rewrite.c> 
        Options -MultiViews 
        RewriteEngine On 
        RewriteCond %REQUEST_FILENAME !-f 
        RewriteRule ^ index.php [L] 
    </IfModule> 
</VirtualHost>

在我的 .hosts 文件中,我显然有:

127.0.0.1       sos.dev

最后:

你肯定得到了conf/extra/httpd-vhosts.conf 文件 包含(未注释)在主要的httpd.conf?

我没有注释 - 是的。

我尝试了另一个链接但无济于事:https://***.com/a/17778222/956975 和 http://www.epigroove.com/blog/laravel-routes-not-working-make-sure-htaccess-is-working

我应该在哪里更改? 我错过了什么?

【问题讨论】:

你的 routes.php 文件是什么样的?你有get routesignup 吗?类似Route::get('signup', function() return 'Hello World'; ); 是的,请看我的问题,你会发现我有 Route::get('signup', function() return 'hello!'; ); 这很奇怪……嗯。你有更新版本的 l4 吗? 【参考方案1】:

您的服务器名称是

sos.dev

Apache 考虑到这一点,您必须使用以下方式访问您的路线:

http://sos.dev/

不是

http://localhost/

【讨论】:

我有同样的问题:Symfony \ Component \ HttpKernel \ Exception \ NotFoundHttpException 错误无论我使用sos.dev 或localhost 还是按照建议添加虚拟主机时出现错误400错误请求。 能否向我们展示您在错误页面(服务器/请求数据)中的 REDIRECT_QUERY_STRING 和 REDIRECT_URL?

以上是关于由于 .htaccess 文件,Laravel 4 路由无法正常工作?的主要内容,如果未能解决你的问题,请参考以下文章

Htaccess 重定向 Laravel 4

Laravel 5.4 artisan 为 /public 的现有文件夹提供 htaccess / 和 Routes::get

iis7 安装laravel5.4环境

htaccess for laravel 在所需文件夹中

使用 .htaccess 防止通过 /public/ 目录访问 Laravel [重复]

Laravel 路由和 .htaccess 文件不适用于 1and1 托管