WordPress如何创建Apache知道的URL?


17

当您在WordPress中创建页面时,它只是数据库表中的一项;该位置没有实际文件。但是,我可以自己在该位置创建一个文件,它将从WordPress窃取页面。我删除了文件,然后无缝返回到WordPress页面。

我很好奇这是如何实现的。大概在WordPress和Apache(?)之间正在发生某些通信。

Answers:


27

实际上,Apache和WordPress之间没有通信。“魔术”发生在Apache mod_rewrite规则中。

对于标准的WordPress安装,您必须遵循以下规则.htaccess

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

注意这一行:RewriteRule . /index.php [L] 在这里,我们告诉Apache内部将任何URL请求重定向到/index.php

除非:此行:RewriteCond %{REQUEST_FILENAME} !-f变为false。这意味着,通过RewriteCond在上面添加内容RewriteRule,我们告诉Apache将所有请求发送到/index.php如果不是现有文件则不发送。

同样,当此行:RewriteCond %{REQUEST_FILENAME} !-d变为false时。这意味着,通过RewriteCond在上面添加此内容RewriteRule,我们告诉Apache将所有请求发送到/index.php,而不是将其发送到现有目录

因此,最后,除非它是现有文件或目录,否则Apache将在内部将所有其他请求发送到/index.php

如您所见,Apache和WordPress之间没有通信。Apache正在自行决定所有事情,我们正在使用RewriteRuleand RewriteCond指令告诉它这样做。

了解更多关于mod_rewrite这里


3
这很棒。我完全理解。我已经看过默认的.htaccess文件很多次了,从没有去分析它。谢谢!
马特

这是一种称为前控制器的设计模式。请注意,它将所有不存在的URL重定向到index.php,这意味着,如果您键入functions.php文件的完整路径,则前控制器将无法工作,并且该网站将提供functions.php。这就是为什么您会经常看到WordPress插件和主题文件以if ( !defined(‘ABSPATH’)) exit;
Sjors Ottjes开头的原因

是的,我已经在插件中看到了,但不了解其用途。因此,如果!defined(‘ABSPATH’)计算结果为true,则表示WordPress以外的其他东西正在尝试访问该脚本(因为wp-config.php中定义了ABSPATH),因此应忽略该请求。那是对的吗?
马特

@matt是的。尽管我不会说“ WordPress以外的东西”。因为您也可以ABSPATH在任何其他PHP脚本中进行定义,所以它将允许您自己的服务器上使用其他脚本。不允许的是从服务器外部(例如,从浏览器)直接访问该文件。因为直接访问该文件,用户无法定义ABSPATH
Fayaz

真的很高兴知道。我一直担心安全性,因此马上就可以利用它。谢谢!
马特
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.