Apache2 无法使用路由 PHP
Apache2 not working with routes PHP
我正在使用 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 工作正常。我也在 public 目录中使用 .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 以查看是否有通向 url 的路由?
下面是我的 apache2 配置文件。
我还是新手,对服务器配置了解甚少。请有人能给我一盏灯吗?谢谢!
这个:
RewriteRule ^.*$ - [NC,L]
它匹配所有内容,并且由于它被标记为 [L]
,不会评估其他 RewriteRules,因此所有重写都在这里停止。这意味着 example.com/foo
的请求将匹配此规则,重写停止,并且将在文件系统中搜索文字 foo
文件 - 它不存在。
然后,即使这条规则不存在,下一行
RewriteRule ^.*$ index.php [NC,L]
也不行。 ANY url 会匹配它,但会删除相关数据,因此 example.com/foo
的请求与 example.com/index.php
的请求相同。不会传入任何查询参数。
你的逻辑应该更像是:
RewriteRule ^(.*)$ index.php?args= [QSA,L]
哪个会做这些类型的翻译:
example.com/foo -> example.com/index.php?args=foo
example.com/bar?baz -> example.com/index.php?args=bar&baz
经过详尽的测试,我找到了解决方案。 htaccess 文件和代码很好。问题是我的服务器没有读取 .htaccess。编辑 apache2.conf 并在 上设置 'AllowOverride All',终于成功了。
此页面 https://docs.bolt.cm/3.0/howto/making-sure-htaccess-works 帮我解决这个问题!
我正在使用 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 工作正常。我也在 public 目录中使用 .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 以查看是否有通向 url 的路由?
下面是我的 apache2 配置文件。
我还是新手,对服务器配置了解甚少。请有人能给我一盏灯吗?谢谢!
这个:
RewriteRule ^.*$ - [NC,L]
它匹配所有内容,并且由于它被标记为 [L]
,不会评估其他 RewriteRules,因此所有重写都在这里停止。这意味着 example.com/foo
的请求将匹配此规则,重写停止,并且将在文件系统中搜索文字 foo
文件 - 它不存在。
然后,即使这条规则不存在,下一行
RewriteRule ^.*$ index.php [NC,L]
也不行。 ANY url 会匹配它,但会删除相关数据,因此 example.com/foo
的请求与 example.com/index.php
的请求相同。不会传入任何查询参数。
你的逻辑应该更像是:
RewriteRule ^(.*)$ index.php?args= [QSA,L]
哪个会做这些类型的翻译:
example.com/foo -> example.com/index.php?args=foo
example.com/bar?baz -> example.com/index.php?args=bar&baz
经过详尽的测试,我找到了解决方案。 htaccess 文件和代码很好。问题是我的服务器没有读取 .htaccess。编辑 apache2.conf 并在 上设置 'AllowOverride All',终于成功了。
此页面 https://docs.bolt.cm/3.0/howto/making-sure-htaccess-works 帮我解决这个问题!