Apache2不使用PHP路由

时间:2016-10-06 20:42:40

标签: php .htaccess routes server apache2

我正在使用PHP 7.0开发应用程序并使用MVC实现路由。我的根文件夹('/')是'public'目录。当我访问地址'localhost'时,我被重定向到index.php,并且路由可用。但是,当我尝试另一个URL访问另一个路由,如'localhost / contact'时,服务器找不到该条目并给出此消息:

Not Found

The requested URL /contact was not found on this server. 

我很确定我服务器配置中的问题(linux mint 18上的apache2),因为我朋友的PC工作正常。我在公共目录中也使用.htaccess文件:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]

在我看来,服务器不运行index.php并尝试访问该路径。我怎么能强制执行index.php来查看是否有通知网址的路由?

这里是我的apache2配置文件。

http://pastebin.com/2mgSjWWV

http://pastebin.com/yD4RpfK8

我还是新手,我对服务器配置知之甚少。请有人给我一个灯?谢谢!

2 个答案:

答案 0 :(得分:3)

此:

RewriteRule ^.*$ - [NC,L]

它匹配一切,并且由于它被标记为[L],因此不会评估其他RewriteRules,因此所有重写都会在此处停止。这意味着对example.com/foo的请求将匹配此规则,重写停止,并且将在文件系统中搜索文字foo文件 - 该文件不存在。

然后,即使这一条规则不存在,下一行

RewriteRule ^.*$ index.php [NC,L]

也行不通。任何网址都会匹配,但随后会删除相关数据,因此example.com/foo的请求与example.com/index.php的请求相同。不会传入任何查询参数。

你的逻辑应该更像:

RewriteRule ^(.*)$ index.php?args=$1  [QSA,L]

会做这些翻译:

example.com/foo      -> example.com/index.php?args=foo
example.com/bar?baz  -> example.com/index.php?args=bar&baz

答案 1 :(得分:0)

经过大量的测试后,我找到了解决方案。 htaccess文件和代码很好。问题是我的服务器没有读取.htaccess。编辑apache2.conf并打开'AllowOverride All',最终可以正常工作。

此页https://docs.bolt.cm/3.0/howto/making-sure-htaccess-works帮我解决了这个问题!