我正在使用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配置文件。
我还是新手,我对服务器配置知之甚少。请有人给我一个灯?谢谢!
答案 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帮我解决了这个问题!