WordPress .htaccess 规则也有例外
WordPress在博客平台上迈出了重要的一步,将其移至功能完善的内容管理系统,该系统具有修订跟踪,对自定义菜单的更多支持以及对我而言最引人入胜的功能-域映射的多站点支持。
如果您不是内容管理系统迷,也没关系。 您可以跳过这篇文章。 但对于我的技术极客、代码负责人和 Apache 涉猎者,我想分享一些有趣的东西,一些很酷的东西。
多站点是一项允许您通过单个 WordPress 安装运行任意数量的 WordPress 网站的功能。 如果您管理多个站点,这很好,因为您可以安装一组经过批准的主题和小部件,并为您的客户站点激活它们。 映射域存在一些技术障碍,但过程并不困难。
我确定的问题领域之一是主题定制。 由于主题可用于多个网站,因此您对主题所做的任何自定义也会影响在多站点安装中使用该主题的任何其他站点。 我解决这个问题的方法是在开始自定义之前复制一个主题,并为我为其设计样式的客户站点清楚地命名主题。
另一个有趣的问题是在 的。htaccess Apache 服务器上的文件。 WordPress 需要在逐个博客的基础上重写路径,并使用重写规则和 PHP 文件中。
WordPress使用以下重写规则:
RewriteRule ^([_0-9a-zA-Z-]+/)?files/(.+) wp-includes/ms-files.php?file=$2 [L]
分解,这意味着:
RewriteRule
– 该指令告诉 Apache 这是一条重写规则。^([_0-9a-zA-Z-]+/)?
– 这是一个正则表达式 (正则表达式) 匹配以字母数字字符和连字符(后跟斜杠的可选字符串)开头的字符串。 括号表示一个捕获组,这意味着匹配的文本可以在替换字符串中使用。files/
– 这匹配字符串“files/”。(.+)
– 这是另一个捕获组,可以匹配任何字符串一次或多次。wp-includes/ms-files.php?file=$2
– 这是替换匹配字符串的替换字符串。 它告诉 Apache 将请求重定向到“wp-includes/ms-files.php”,并将第二个捕获组的值($2)作为名为“file”的查询参数。[L]
– 这是一个标志,告诉 Apache 在该规则匹配时停止处理任何进一步的规则。
本质上,mysite.com/files/directory子目录中的所有内容都将被重写为mysite.com/files/wp-includes/myblogfolderpath…,这是很有趣的地方。 如果您实际上需要在服务器上拥有mysite.com/files/myfolder/myimage.jpg这个文件,该怎么办? 您收到404错误,这就是发生的情况。 Apache重写规则开始执行并更改路径。
当然,您可能永远不会遇到这个问题,但是我做到了。 我有一个网站,该网站需要使用其他网站上的javascript小部件,并且需要在mysite.com/files/Images/myfile中找到图形。 由于无法在主机站点上更改文件,因此我需要找出一种在服务器上执行此操作的方法。 一种简单的解决方案是创建一个重写条件,使特定文件例外。
这里是解决方案:
RewriteCond %{REQUEST_URI} !/?files/Image/file1.jpg$
RewriteCond %{REQUEST_URI} !/?files/Image/file2.jpg$
RewriteRule ^([_0-9a-zA-Z-]+/)?files/(.+) wp-includes/ms-files.php?file=$2 [L]
分解:
线1:
RewriteCond
– 该指令告诉 Apache 这是一个 RewriteCond 规则。%{REQUEST_URI}
– 这是一个服务器变量,包含请求的 URI 的路径。!
– 这是一个否定运算符,意思是“不”。 它用于反转条件。/?files/Image/file1.jpg$
– 这是一个正则表达式,与请求的 URI 末尾的字符串“/files/Image/file1.jpg”完全匹配。 “文件”之前的问号和正斜杠使前导斜杠可选。
线2:
RewriteCond
– 该指令告诉 Apache 这是一个 RewriteCond 规则。%{REQUEST_URI}
– 这是一个服务器变量,包含请求的 URI 的路径。!
– 这是一个否定运算符,意思是“不”。 它用于反转条件。/?files/Image/file2.jpg$
– 这是一个正则表达式,与请求的 URI 末尾的字符串“/files/Image/file2.jpg”完全匹配。 “文件”之前的问号和正斜杠使前导斜杠可选。
线3:
RewriteRule
– 该指令告诉 Apache 这是一条重写规则。^([_0-9a-zA-Z-]+/)?
– 这是一个正则表达式,匹配以可选的字母数字字符和连字符后跟斜杠开头的字符串。 括号表示一个捕获组,这意味着匹配的文本可以在替换字符串中使用。files/
– 这匹配字符串“files/”。(.+)
– 这是另一个捕获组,可以匹配任何字符串一次或多次。wp-includes/ms-files.php?file=$2
– 这是替换匹配字符串的替换字符串。 它告诉 Apache 将请求重定向到“wp-includes/ms-files.php”,并将第二个捕获组的值($2)作为名为“file”的查询参数。[L]
– 这是一个标志,告诉 Apache 在该规则匹配时停止处理任何进一步的规则。
重写条件必须放在重写规则之前,否则此技巧将不起作用。 如果您遇到类似的问题,为自己的目的修改此条件应该很容易。 该解决方案对我来说效果很好,允许我替换自定义图形,而不是不适合我的设计的替代文本。 希望它也对您有用。