在 WordPress 4.7 多站点的默认 .htaccess 规则中子域名安装时,我试图了解一条特定规则的目的。
首先我将单独介绍这条规则
RewriteRule ^(wp-(content|admin|includes).*) $1 [L]
在我看来,这条规则似乎只是将 wp-content、wp-admin 或 wp-includes 中的任何 URL 重写为自身。由于它是在文件系统检查之后出现的,我们知道它在文件系统中不存在,所以我不知道它想做什么。
现在,这是建议的 .htaccess 文件的全部内容。规则位于倒数第三条。
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
# add a trailing slash to /wp-admin
RewriteRule ^wp-admin$ wp-admin/ [R=301,L]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^(wp-(content|admin|includes).*) $1 [L]
RewriteRule ^(.*\.php)$ $1 [L]
RewriteRule . index.php [L]
任何人能提供的任何见解都将非常棒。每当有人尝试访问除 wp-content/ 之外不存在的任何目录时,我都会收到一条错误消息 - “请求超出了 10 次内部重定向的限制,这可能是由于配置错误。”。我希望得到 404。
不管怎样,根据这张票,这似乎是一个长期存在的 WP 问题
https://core.trac.wordpress.org/ticket/20746
那里有修复建议,但我希望了解我部署在那里的任何更改,因为它不会是“官方 WP”。我认为,了解该规则如何导致除自我重写之外的任何事情将有助于我对部署建议的更改之一充满信心。
编辑:以下是应用该规则的一个示例:
[rid#7f58a5a5dcb0/initial/redir#2] [perdir /var/www/wordpress/] applying pattern '^(wp-(content|admin|includes).*)' to uri 'wp-content/invalid_directory/nothing.png'
[rid#7f58a5a5dcb0/initial/redir#2] [perdir /var/www/wordpress/] rewrite 'wp-content/invalid_directory/nothing.png' -> 'wp-content/invalid_directory/nothing.png'
[rid#7f58a5a5dcb0/initial/redir#2] [perdir /var/www/wordpress/] add per-dir prefix: wp-content/invalid_directory/nothing.png -> /var/www/wordpress/wp-content/invalid_directory/nothing.png
[rid#7f58a5a5dcb0/initial/redir#2] [perdir /var/www/wordpress/] trying to replace prefix /var/www/wordpress/ with /
[rid#7f58a5a5dcb0/initial/redir#2] strip matching prefix: /var/www/wordpress/wp-content/invalid_directory/nothing.png -> wp-content/invalid_directory/nothing.png
答案1
RewriteRule ^(wp-(content|admin|includes).*) $1 [L]
我认为该指令的主要目的是在请求以、或index.php
开头的 URL 时阻止对文件进行进一步处理(即阻止将请求转发到前端控制器:)。/wp-content
/wp-admin
/wp-includes
通过重写自身,URL 保持不变,处理停止。
然而,由此产生的代换也是相对的,因此,任何被声明为 的内容RewriteBase
也将作为重写 URL 的前缀。在本例中,RewriteBase
只是/
,因此它确实在第一次传递时被重写为自身(假设此.htaccess
文件位于文档根目录中)。我认为这一定是故意的,否则他们会使用连字符 (-
) 作为代换,如上面的指令所示。
这“不应该”导致重写循环,因为如果 URL 未经更改地通过,处理就应该停止(重写本质上被“忽略”)。
但是,为了确保它没有改变,你可以简单地替换$1
为-
RewriteRule
代换。
如果您启用完全重写调试,例如LogLevel rewrite:trace6
在 Apache 2.4+ 上的服务器配置中,您应该准确地看到正在发生的情况,因为它应该显示重写的每次迭代。