许多人都知道,当有人创建StackOverflow问题时,会生成一个新页面,并且它也会在各种搜索引擎中显示。我想知道PHP代码是如何创建这些页面的。事实证明,像这样的大多数网站都有一个页面,比如profile.php,它从MySQL数据库加载数据。我的问题如下:如果只有一个物理文件,URL如何变化,如果只有一个实际页面,谷歌如何从StackOverflow或Facebook等网站列出所有页面/配置文件/问题?
答案 0 :(得分:2)
查看此问题所在页面的网址:
http://stackoverflow.com/questions/39457314/how-does-php-create-new-html-pages
服务器的硬盘上没有物理文件。只有一个主脚本叫做#34;显示一个问题页面"。一般来说,动态生成的页面会发生什么:
网址从"友好"一个"丑陋"的URL内部的。虽然Stackoverflow不是用PHP编写的,但如果是这样的话,你最终会在内部得到这样的东西:
http://stackoverflow.com/showquestion.php?id=39457314
Webserver执行showquestion.php
脚本
答案 1 :(得分:1)
正如评论暗示的那样,这是由HTTP服务器中的URL重写处理的。
默认情况下,知道URL对应于具有相同路径名的物理PHP文件可能会有所帮助,但这可以被覆盖。您可以创建Apache重写规则,以便任何PHP脚本处理URL请求。
https://framework.zend.com/manual/1.12/en/project-structure.rewrite.html中显示了一个示例:
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
真正处理,无论网址是什么。在该脚本中,代码可以读取原始请求,然后代码可以决定该请求的组件对应用程序的意义。
答案 2 :(得分:0)
您告诉搜索引擎'Google,Bing,..等',看看您的网站是sitemap.xml
列出您的网页,允许他们的网络机器人(蜘蛛)访问网站并抓取数据和链接,您可能有一个页面,如posts.php
,但与参数posts.php?id=123
或posts.php?name=mypost
编辑:
如果要使用一个文件posts.php
并创建网站http://domain.com/posts/posttitle
,则需要应用前端控制器模式site point link,这意味着设置服务器Apache / Nginx将请求重定向到一个文件(URL重写)此文件包含处理请求或使用MVC框架的逻辑
答案 3 :(得分:0)
Apache(以及PHP)使用Mod_Rewrite将URL重写为更易读的类似目录的名称。例如,您可以使用它来转动
www.example.com/index.php?area=blog&which=entry
进入
www.example.com/blog/entry
HTTP标头不必与实际的文件系统匹配,因此Apache会将它们欺骗到任何想要的地方。
这可能没有mod_rewrite,但我不知道怎么说
答案 4 :(得分:0)
答案是路由。
举个例子网址... httml://www.mysite.com/users/profile/jimmy
如果您正在使用路由系统(大多数框架都有一个),那么.com /(称为'路径')之后的任何内容都会被视为地图。路由系统使用此映射来查找数据。
许多路由系统打破了这条路径'分段。上面的示例将分为以下几个部分。
对于大多数框架,路由系统会像这样解释地图......
controller/action/param-1/param-2/param-3
'控制器'是指一个班级'在面向对象的PHP
中'动作'是一个'功能'的另一个词,也被称为'方法'
最后,参数引用我们想要传递的数据,也许它是一个名称,通常它是一个id。
路由器将采用示例'路径'以上,然后像这样搜索...
采取第一部分。寻找一个班级'叫用户。查找称为用户的类。在名为users的类中查找名为profile的函数。查找配置文件功能。将数据传递给函数。使用传递的数据执行函数。
这是路由器搜索的基本代码结构
<?php
class Users // the controller
{
function profile($name) // the action
{
'Profile for ' . $name; // the passed data 'jimmy'
}
}