如何使所有URL通过单个PHP文件运行?


9

这些形式的URL的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

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

[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

编辑:哦,这是/index.php的完整内容。当我删除重写规则时,它将输出“ /”或“ /index.php”,否则我将得到404。

<?php
echo htmlspecialchars($_SERVER['REQUEST_URI']);
?>

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

再次解决:原来只需要/,因为我正在运行2.2.4。当我升级到2.2.11时,不再需要/。


您使用了哪些规则?我已经尝试了两个,并且都运行良好。您确定已激活mod_rewrite吗?
Manuel Faux

如果mod_rewrite不处于活动状态,则服务器将无法启动。如果重要的话,这是WinXP上的Apache 2.2。
jmucchiello,2009年

Answers:


12

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

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

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

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


请参阅上面的编辑。得到错误
400。– jmucchiello

您发送到服务器的确切请求是什么?您的服务器是否安装了mod_rewrite?我确实是这样,因为否则它不会因为语法错误而启动。
Manuel Faux

编辑将显示确切的请求:localhost:8181localhost:8181 / abc。如果删除重写规则,则使用/获得index.php,使用/ abc获得正常的404。
jmucchiello,2009年

我在index.php前面添加了一个/,从而解决了该问题。
jmucchiello,2009年

神秘...我已经进行了无斜杠的测试,它对我来说是apache-2.2.11-8。
Manuel Faux

1

下面的代码使用Apache的mod_rewrite重写所有未指向要映射到index.php的物理文件或目录的URL。最终结果将是:

http://www.example.com/index.php/foo/bar/baz
http://www.example.com/index.php/goo/car/caz/SEO-friendly-name-of-the-object
http://www.example.com/index.php/hey/you

重写规则:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [PT,L,QSA]

说明:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

以上两行都表明此规则不适用于常规文件(-f)或目录(-d)。

RewriteRule ^(.*)$ index.php/$1 [PT,L,QSA]

可从Apache网站收集有关如何创建mod_rewrite规则的更多信息:http : //httpd.apache.org/docs/2.2/mod/mod_rewrite.html


请参阅上面的编辑。得到错误
400。– jmucchiello

我希望我可以将两个答案都设置为正确的。
jmucchiello,2009年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.