使用 Mod_rewrite 将所有内容重定向到 Index.php

要重写对 PHP 的所有请求,我们可以使用 .htaccess,或者更好的是,使用 Apache 配置文件。

我们经常可以在 /etc/apache2/sites-available 中找到 Virtual Host 配置文件,并且应该将代码添加到目录块中。

我个人更喜欢在实时服务器上使用 Apache 配置文件,也可能在本地测试服务器上使用 .htaccess。
在 IDE 中编辑 .htaccess 文件会更容易,而且我们不必重新加载或者重新启动 Apache 使更改生效。

要重定向所有内容,除了存在的文件,我们可以使用以下命令:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$index.php [QSA,L]

重定向所有内容,包括存在的文件:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^.*$index.php [QSA,L]

index.php 前面的破折号“/”是不需要的,使用这些规则时也不需要指定DirectoryIndex。

使用 mod_rewrite

处理重写的第一种方法取自 mod_rewrite 文档,在 Fallback Resource 部分下:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$index.php [QSA,L]

这告诉 Apache 重写所有与存在的文件或者目录不对应的 URL。
显然,分别由 !-f 和 !-d 规则控制。
但是,如果我们想将所有内容都传递给 PHP,该怎么办?
事实证明,我们不能简单地删除 RewriteCond,因为这会不直观地导致 500 内部服务器错误。

相反,你必须借助一些技巧,例如:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^.*$index.php [QSA,L]

然而,第一个示例实际上可能是最好的,因为它允许 Apache 仍然提供一些静态文件。
如果我们使用 php-fpm,我们可能希望将其与 ProxyErrorOverride 结合使用以启用自定义错误页面。

最后,要完全清除所有东西,QSA 部分意味着应该添加查询字符串,而 L 标志意味着它应该是最后一个要处理的重写规则。

日期:2020-06-02 22:17:13 来源:oir作者:oir