【问题标题】:Routes not working without index.php没有 index.php 的路由不起作用
【发布时间】:2014-03-06 21:48:56
【问题描述】:

我正在使用 laravel 4。

我有一个视图nest.blade.php和对应的控制器NestController.php:

控制器内容:

class NestController extends BaseController {

    public function showView()
    {
        return View::make('nest');
    }

}

路线:

Route::get('/nest', 'NestController@showView');

当我转到 url/nest 时,它不起作用。 当我去 url/index.php/nest 它确实有效。

显然我只是希望它是 /nest 没有 index.php。

我该如何解决这个问题?

我的 htaccess:

IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On

    # Redirect Trailing Slashes...
    RewriteRule ^(.*)/$ /$1 [L,R=301]

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

【问题讨论】:

  • 根据您的 .htaccess 似乎您正在运行 Laravel 4.1?无论如何,我将您的路由和控制器复制到了我的环境(4.0 和 4.1)中,并且一切都与/nest url 一起工作。这些都没有错。
  • 有趣。这可能与我的虚拟主机有关吗?或者我在安装过程中没有做一些使路线能够工作的事情吗?所有这些可能性我都在思考。是的,我正在运行的最新版本。
  • 是的,我会调查这些,但不幸的是,这超出了我的知识范围。正如我所说,一切都在我的环境中与您的 routes.php、控制器甚至 .htaccess 完美配合。我的 apache2 使用所有默认设置运行,因此也不需要任何特殊设置。
  • 我建议您添加一个重写规则,以防止在您使用此方法时访问您的 .env 文件和根文件夹中的其他文件。尝试从项目根目录访问 .env 文件,例如 your-project/.env 我建议使用如下重写规则:RewriteRule ^(.*)env$ 404.php

标签: php laravel laravel-routing


【解决方案1】:

漂亮的网址

框架附带一个 public/.htaccess 文件,用于允许 没有 index.php 的 URL。如果你使用 Apache 来服务你的 Laravel 应用程序,请务必启用 mod_rewrite 模块

如果 Laravel 附带的 .htaccess 文件不适用于您的 Apache安装,试试这个:

Options +FollowSymLinks
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]

如需更多相关帮助,请查看this answer

【讨论】:

  • 我会接受你的回答谢谢。对于其他人,不要使用上面的代码,答案在链接中,我不得不a2enmod重写
  • @TheAlpha 老兄,这花了我大约 4 个小时。它终于奏效了!谢谢!!
  • @JoshHarington,很高兴你终于成功了 :-)
  • 第一个对我有用。如果它对我有用,我会尝试你的答案
【解决方案2】:

我在 Apache HTTP 服务器中启用了 mod_rewrite 模块,重新启动了 Apache 服务并再次测试,它工作了!!!

下面是我用来启用mode_rewrite的代码;

1) 在 Apache/conf/httpd.conf 中取消哈希这一行

LoadModule rewrite_module modules/mod_rewrite.so

2) 为“sample-project”新建一个配置,不修改httpd.conf文件中的默认配置

目录“C:/Apache24/htdocs/sample-project”> 选项索引 FollowSymLinks MultiViews 允许覆盖所有 命令允许,拒绝 允许所有人 目录>

【讨论】:

  • 我用于 ubuntu 服务器 cd /etc/apache2;须藤苏; vim apache2.conf;我添加了 Options Indexes FollowSymLinks MultiViews AllowOverride All Order allow,deny Allow from all
【解决方案3】:

保持警惕!如果即使在启用重写模块后它也不起作用。您需要在 httpd.conf 中将“AllowOverride None”这一行更改为“AllowOverride All”。

正如@The Alpha 提醒的那样,Laravel 不需要为此目的进行配置。

【讨论】:

    【解决方案4】:

    当您将httpd.conf 中的AllowOverride None 行更改为AllowOverride All 时,请确保您在包含有效路径的&lt;directory ...&gt; 内执行此操作。

    例子

    <Directory "/var/www/html"> #check path
       Options Indexes FollowSymLinks
       AllowOverride All
    </Directory>
    

    【讨论】:

    • 你是对的,只在我们的特定网页内容目录中应用“AllowOverride All”语句,例如在您上面的代码中,而不是在 部分/块中。在 httpd.conf 的备注中明确提到了。
    【解决方案5】:

    由于某些原因,上面的答案对我不起作用,所以这是唯一对我有用的答案。

    我正在使用 ubuntu 18.04 amd64 作为我的开发服务器环境。 所以我修改了 apache.conf 文件位于/etc/apache2

    发件人:

    <Directory /var/www/> Options Indexes FollowSymLinks AllowOverride None Require all granted
    

    收件人:

    <Directory /var/www/> Options Indexes FollowSymLinks AllowOverride All Require all granted
    

    还有来自:

    <Directory /usr/share> AllowOverride None Require all granted
    

    收件人

    <Directory /usr/share> AllowOverride All Require all granted
    

    之后,需要在终端使用sudo service apapche2 restart命令重启apache

    现在我可以在不使用 URL 中的 index.php 的情况下访问该页面

    归功于:joshymatheww@Laracasts servers discussion channel on Aug 5, 2017

    【讨论】:

      【解决方案6】:

      登录终端

      sudo nano /etc/apache2/apache2.conf
      

      行后

      <Directory /var/www/>
      .
      .
      .
      </Directory>
      

      并粘贴下面的代码

      <Directory /var/www/html/>
                      Options Indexes FollowSymLinks MultiViews
                      AllowOverride All
      </Directory>
      

      现在是 Ctrl+O,然后是 Ctrl+M,然后是 Ctrl+x

      现在重启apache服务器

      sudo service apache2 restart
      

      【讨论】:

        【解决方案7】:

        在你的 .htaccess 中设置这个

        DirectoryIndex index.php
        
        <IfModule mod_rewrite.c>
        <IfModule mod_negotiation.c>
            Options -MultiViews
        </IfModule>
        
        RewriteEngine On
        
        RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
        RewriteRule ^(.*) - [E=BASE:%1]
        
        RewriteCond %{ENV:REDIRECT_STATUS} ^$
        RewriteRule ^index\.php(/(.*)|$) %{ENV:BASE}/$2 [R=301,L]
        
        RewriteCond %{REQUEST_FILENAME} -f
        RewriteRule .? - [L]
        
        RewriteRule .? %{ENV:BASE}/index.php [L]
        

        【讨论】:

          【解决方案8】:

          试试下面的 .htaccess。在服务器或本地主机环境中,我从来没有遇到过任何问题。

          DirectoryIndex index.php

              <IfModule mod_rewrite.c>
                  <IfModule mod_negotiation.c>
                      Options -MultiViews
                  </IfModule>
          
                  RewriteEngine On
          
                  RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
                  RewriteRule ^(.*) - [E=BASE:%1]
          
                  RewriteCond %{ENV:REDIRECT_STATUS} ^$
                  RewriteRule ^index\.php(/(.*)|$) %{ENV:BASE}/$2 [R=301,L]
          
                  RewriteCond %{REQUEST_FILENAME} -f
                  RewriteRule .? - [L]
          
                  RewriteRule .? %{ENV:BASE}/index.php [L]
          
              </IfModule>
          

          【讨论】:

            【解决方案9】:

            首先你需要在/etc/apache2/apache2.conf 中设置AllowOverride All。找到以下块:

            <Directory /var/www/>
                    Options Indexes FollowSymLinks
                    AllowOverride All
                    DirectoryIndex index.php
                    Require all granted
            </Directory>
            

            那么你需要先修改/etc/apache2/mods-available/dir.conf并移动index.php:

            <IfModule mod_dir.c>
                    DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm
            </IfModule>
            

            不要忘记:运行 a2enmode

            sudo a2enmod rewrite
            

            然后

            sudo service apache2 restart
            

            这样你就可以将它应用于你所有的 laravel 项目(在 /var/www/ 文件夹内)。

            【讨论】:

              猜你喜欢
              • 2016-02-29
              • 2015-04-12
              • 1970-01-01
              • 2023-04-02
              • 2012-01-17
              • 1970-01-01
              • 2019-07-20
              • 1970-01-01
              相关资源
              最近更新 更多