В правилах по умолчанию .htaccess для мультисайта WordPress 4.7 субдомен установка, я пытаюсь понять цель одного конкретного правила.
Сначала я представлю правило отдельно
RewriteRule ^(wp-(content|admin|includes).*) $1 [L]
По отдельности, мне кажется, что правило просто перезаписывает любой URL-адрес в wp-content, wp-admin или wp-includes на себя. Поскольку он поступает после проверки файловой системы, мы знаем, что он не существует в файловой системе, поэтому я не понимаю, что он пытается сделать.
Теперь вот весь предлагаемый файл .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]
Любое понимание, которое может дать любой, было бы фантастическим. Я получаю сообщение об ошибке: «Запрос превысил ограничение в 10 внутренних перенаправлений из-за возможной ошибки конфигурации». - всякий раз, когда кто-либо пытается получить доступ к любому каталогу за пределами wp-content /, который не существует. Вместо этого я бы надеялся на 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
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+ вы должны точно видеть, что происходит, поскольку он должен отображать каждую итерацию перезаписи.