在WordPress 4.7多站点子域安装的默认.htaccess规则中,我试图理解一个特定规则的目的。
首先我会自己提出这个规则
RewriteRule ^(wp-(content|admin|includes).*) $1 [L]
在我看来,这个规则似乎只是简单地将wp-content或者wp-admin或者wp-includes中的任何url重写到自己。 由于它是在文件系统检查之后发生的,我们知道它在文件系统上不存在,所以我不知道它要做什么。
现在这里是整个build议的.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]
任何人都可以摆脱的任何洞察力都是太棒了。 我收到一个错误 – “由于可能的configuration错误,请求超过了10个内部redirect的限制”。 – 任何时候任何人试图访问wp-content /之外的任何不存在的目录。 我会希望404代替。
对于这个票来说,这似乎是一个长期运行的WP问题
https://core.trac.wordpress.org/ticket/20746
有修复的build议,但我想了解我部署的任何变化,因为它不会是“官方WP”。 我在想,理解这个规则如何导致除了自我重写之外的任何事情都会帮助我有信心部署一个build议的变化。
编辑:这是一个应用规则的例子:
[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
RewriteRule ^(wp-(content|admin|includes).*) $1 [L]
我认为该指令的主要目的是在请求一个启动/wp-content
, /wp-admin
或者/wp-content
, /wp-admin
的URL时阻止文件的进一步处理(即阻止请求被转发到前端控制器: index.php
) /wp-includes
。
通过重写本身,URL通过不变,处理停止。
然而,由此产生的替代也是相对的 ,所以无论是作为RewriteBase
还是以重写的URL为前缀。 在这种情况下, RewriteBase
就是/
,所以它在RewriteBase
确实被重写(假设这个.htaccess
文件在文档根目录下)。 我认为这一定是故意的,否则他们会用一个连字符( -
)作为替代 ,就像上面的指令一样。
这个“不应该”导致重写循环,因为如果URL通过不变(重写本质上被“忽略”),处理应该停止。
但是,要确定它没有改变,你可以简单地用$1
replaceRewriteRule
replace 。
如果你启用完整的重写debugging,例如。 LogLevel rewrite:trace6
在Apache LogLevel rewrite:trace6
的服务器configuration中LogLevel rewrite:trace6
,你应该看到到底发生了什么,因为它应该显示重写的每一次迭代。