由laravel 5.5无法获取url中的参数引发的apache的.htaccess文件问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/LJFPHP/article/details/81666970

一、前言

      我这边碰到的问题就是,无法获取url中的get参数。本地使用的是laravel 5.5版本。明明url里面清清楚楚的写着参数,但是你却获取不到,这感觉实在是很气很气。刚开始以为是laravel的问题,后面才发现,罪魁祸首还是apache的重写规则。

这是我之前碰到的重写规则问题:

apache报错:Internal Server Error:The server encountered an internal error or misconfiguration and was

二、排错过程

1、保证本地的larrvel正常使用,其他功能都正常,只是获取get参数时候获取不到
2、本地访问的是一个虚拟网站,用apache新建的虚拟网点。那么会不是这个虚拟站点建立的有问题呢
3、前几天配置过本地的.htaccess文件。那么很可能是配置问题
4、上网百度.htaccess文件的问题

三、问题所在

1、.htaccess文件的作用

        .htaccess是一个纯文本文件,它里面存放着Apache服务器配置相关的指令。
       .htaccess主要的作用有:URL重写、自定义错误页面、MIME类型配置以及访问权限控制等。主要体现在伪静态的应用、图片防盗链、自定义404错误页面、阻止/允许特定IP/IP段、目录浏览与主页、禁止访问指定文件类型、文件密码保护等。
       .htaccess的用途范围主要针对当前目录。

2、找到问题所在

上面那段话的最后一句,.htaccess文件只针对当前目录,而我在虚拟主机中配置的路径是:

<VirtualHost *:80>
# ServerAdmin [email protected]
    DocumentRoot "E:\test\public"
    ServerName www.test.com
    DirectoryIndex index.html index.php
</VirtualHost>

      由于用的是laravel的项目,所以配置的虚拟主机目录指向的是public目录。项目入口文件是/public/index.php文件。而我之前配置的.htaccess文件是在test目录下,也就是根目录下,所以没有起到作用。

3、在public目录下新建.htaccess文件

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /index.php [L]

4、重启apache,然后发现可以正常获取到get中的参数了。

三、关于.htaccess文件的配置内容

我前几天写过一篇类似的帖子,记录的是我之前放在项目根目录下的.htaccess文件:

apache报错:Internal Server Error:The server encountered an internal error or misconfiguration and was

扫描二维码关注公众号,回复: 3307985 查看本文章

这里对比下两次配置的.htaccess文件:

1、根目录下配置的

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /index.php?/$1 [L]
1、这句正则的意思,前面的^(.*)$代表前面的路径是任意匹配的,一直到碰到index.php为止。

2、问号在正则中的意思:问号可以表示重复前面内容的0次或一次,也就是要么不出现,要么出现一次。也就是说,这个index.php可以有,也可以没有,并不是强制的
3、后面的$1代表正则中的第一个括号中的内容,也就是(.*)这部分

2、public 目录下的.htaccess文件

RewriteEngine On

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

(1)、REQUEST_FILENAME:这是与请求相匹配的完整的本地文件系统的文件路径名。
(2)、RewriteCond:类似于条件语句,只有满足这些条件之后,才会继续往下面执行,找到规则匹配部分
(3)、RewriteRule:规则匹配部分,也就是我们常说的正则
(4)、“-d”————-(目录)将REQUEST_FILENAME的结果视为一个路径名并测试它是否为一个存在的目录。
(5)、“-f “————-(常规文件)将REQUEST_FILENAME视为一个路径名并测试它是否为一个存在的常规文件。
(6)

NC: no case,就是说不区分大小写
R:redirect,重定向
F:forbidden,禁止访问
L:last,表示已经是最后一条规则,.htaccess文件解析即将退出

(7)、具体解析:

RewriteCond %{REQUEST_FILENAME} !-f

如果文件存在,就直接访问文件,不进行下面的RewriteRule.(不是文件或文件不存在就执行重写)

RewriteCond %{REQUEST_FILENAME} !-d

如果目录存在就直接访问目录不进行RewriteRule

RewriteRule ^ index.php [L]

从‘^’开始进行字符匹配,当匹配到index.php之后停止。而且这是 last最后的rules(L)的 。

这部分参考博文:
apache的.htaccess文件作用和相关浅析

3、两个 .htaccess文件的区别

第一个.htaccess文件,代表index.php只是一个中间文件,在index.php的前面和后面都是可以有其他字符出现的,并且index.php文件不是必须的。

第二个 .htaccess文件,代表index.php就是最后的匹配条件,而且是必须的。

四、结论

      根据我的业务要求,laravel的根目录就是/public/index.php,index.php后面不需要其他的部分。匹配到入口文件之后,后面就是路由的事情了。我之所以在之前获取不到get的参数,就是因为在之前的配置规则中,把index.php当做了中间文件,后面部分也作为匹配规则。这不符合laravel的路由原则。修改.htaccess文件之后,即可正常获取get中的参数。

end

猜你喜欢

转载自blog.csdn.net/LJFPHP/article/details/81666970