如何让所有 URL 都通过一个 PHP 文件运行?

jmu*_*llo 9 php mod-rewrite mvc apache-2.2

网址采用这些形式的 MVC 系统如何通过单个 index.php 文件强制所有请求?

http://www.example.com/foo/bar/baz
http://www.example.com/goo/car/caz/SEO-friendly-name-of-the-object
http://www.example.com/hey/you
Run Code Online (Sandbox Code Playgroud)

编辑:当我尝试下面的重写规则时,出现此错误:

[error] [client 127.0.0.1] Invalid URI in request GET / HTTP/1.1
[error] [client 127.0.0.1] Invalid URI in request GET /abc HTTP/1.1
Run Code Online (Sandbox Code Playgroud)

编辑:哦,这是/index.php 的完整内容。当我删除重写规则时,它会输出 '/' 或 '/index.php' 或者我得到 404 其他任何东西。

<?php
echo htmlspecialchars($_SERVER['REQUEST_URI']);
?>
Run Code Online (Sandbox Code Playgroud)

已解决:我在重写规则中的 index.php 前面添加了一个 / ,然后它起作用了:

再次解决:结果 / 只需要,因为我运行的是 2.2.4。当我升级到 2.2.11 时,不再需要 /。

Man*_*aux 12

如果您使用的是 Apache,请通过mod_rewrite以下方式使用重写:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?q=$1 [L,QSA]
Run Code Online (Sandbox Code Playgroud)

这会将您的 URL 透明地重写为 »index.php?q=foo/bar/baz«。

2. 和 3. 行告诉重写引擎不要重写指向现有文件或目录的 URL。这是访问 httpd 服务器提供的真实文件所必需的。