Назад | Перейти на главную страницу

Что делает это правило wordpress .htaccess?

В правилах по умолчанию .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+ вы должны точно видеть, что происходит, поскольку он должен отображать каждую итерацию перезаписи.