如何理解PHP';s URL解析/路由?

如何理解PHP';s URL解析/路由?,php,iis,web,url-routing,Php,Iis,Web,Url Routing,我刚刚继承了一个用PHP构建的网站。www.mysite.com主页的某个地方有一个指向www.mysite.com/index/35.html的href。在站点的根目录及其子目录中没有文档35.html 数字35实际上是数据库中的一个id,该数据库也保存页面的html内容 如果我加载URL:www.mysite.com/index.php?id=35,则加载相同的页面 PHP如何知道如何自动转换 /index/35.html 到 /index.php?id=35 编辑 根据这些答案,我找到了

我刚刚继承了一个用PHP构建的网站。www.mysite.com主页的某个地方有一个指向www.mysite.com/index/35.html的href。在站点的根目录及其子目录中没有文档35.html

数字35实际上是数据库中的一个id,该数据库也保存页面的html内容

如果我加载URL:www.mysite.com/index.php?id=35,则加载相同的页面

PHP如何知道如何自动转换

/index/35.html

/index.php?id=35


编辑 根据这些答案,我找到了一个.htaccess文件,其中包含解释功能的重写说明

但是,IIS似乎不知道(或未配置)如何使用它。(可能是因为这是Apache的一项功能?)


因此,这就引出了一个问题:有没有办法配置IIS来处理这个问题?

没有。有一条规则可以从
/index/foo
重写到
/index.php?id=foo
,可以在
.htaccess
文件中的某个地方,也可以在httpd配置本身中。这将通过使用.htaccess-在webroot中进行URL重写来完成

它可能看起来像:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [QSA,L]
可能还有其他比特,但这基本上告诉apache的是将物理上不存在的任何东西发送到index.php

RewriteEngine On
RewriteRule ^index/([\d]+)\.html /index.php?id=$1 [NC,L]
这太离谱了。任何试图加载以index/开头的地址的浏览器都会在内部重定向到index.php?id=无论数字是什么


编辑:刚刚看到你在IIS上的工作。这可能对你不起作用。抱歉。

我想您将使用.htaccess将所有请求重定向到index.php。从那里,您可以向查询字符串传递一个路由类,该类将解析url并标识唯一ID。 在这种情况下,我们可以说like,您的路由类将把请求/index/35.html解析为
indexController,indexAction,id=35
。现在,您可以将此id传递给模型以获取相应的页面内容


注意:这里我假设您使用的是mvc模式。无论如何,它可以用你自己的方式处理,概念保持不变。希望这有意义。

这是您的Web服务器的一个功能。您使用的是哪台服务器?阿帕奇?看来你说的是调度员。看看这个。看看我的答案/评论-我在IIS上使用ColdFusion时使用过它,并且在使用标准apache样式的重写命令时使用得非常好。谢谢大家@Brian因为提到IIS的ISAPI_重写而得到它。很好,它在.htaccess中,但在IIS下似乎不起作用,这意味着重写会导致404。这是Apache的东西吗?是的,尽管有ISAPI模块可以模拟它。我的.htaccess中也有类似的东西,但是它似乎不适用于IIS。这是Apache的功能吗?是的。有一个IIS重写工具()(在过去的几年里没有使用过),它允许使用相同的重写规则。谢谢@Brian,我会看看。我在.htaccess文件中发现了这样的重写。然而,IIS似乎没有利用这一点。这是重写Apache的特性吗?IIS是否有一个等价物?@tzup-是的,有-请看我上面的评论:)事实上,我没有,但你提到.htaccess是对的。我没有投你反对票。