WordPress Multisite, пользовательская папка wp-content и запрос превысили лимит в 10 внутренних перенаправлений


Я пишу плагин WordPress, который использует API настроек внутри класса. Поэтому класс вызывает register_settings (), add_settings_field () и add_settings_section () из класса, который работает хорошо, за исключением тех случаев, когда я пытаюсь отправить форму a получить ошибку сервера со следующей ошибкой в моих журналах:

AH00124: Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace.

Моя установка WordPress немного странная. Он основан на репо скелета WordPressМарка Яквита , и я переместил свою папку wp-content, мой wp-config.PHP-файл вне WordPress.

Я также запускаю WordPress через Vagrant, так что это может быть проблема конфигурации сервера. Тем не менее, я просто попытался использовать свой плагин в VVV, используя стандартную установку WordPress, и он отлично работает.

Мой каталог WordPress выглядит так (composer install WP to the app dir):

index.php
wp-config.php
wp-content/
app/

Я добавил свои журналы перезаписи в ячейку вставки: http://pastebin.com/QKCFjULZ

Мой .файл htaccess выглядит следующим образом:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index.php$ - [L]

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule . - [L]


RewriteRule ^([_0-9a-zA-Z-]+/)?files/(.+) wp-includes/ms-files.php?file=$2 [L]

RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-.*) /app/$2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*.php)$ /app/$2 [L]


RewriteRule . /index.php [L]

Options -indexes
</IfModule>
# END WordPress
1 5

1 ответ:

У вас есть цикл перенаправления из-за этих правил

RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-.*) /app/$2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ /app/$2 [L]
На самом деле, вы должны иметь в виду, что ваши правила оцениваются даже после перезаписи. Таким образом, если у вас есть /something/wp-xxx/yyy/zzz, он будет внутренне переписан на /app/wp-xxx/yyy/zzz. Но теперь, как вы можете видеть, ваше правило снова будет соответствовать новому uri /app/wp-xxx/yyy/zzz.

Доказательство, глядя на ваши журналы

applying pattern '^([_0-9a-zA-Z-]+/)?(wp-.*)' to uri 'wp-admin/network/options.php',
rewrite 'wp-admin/network/options.php' -> '/app/wp-admin/network/options.php',

Тогда у вас есть

applying pattern '^([_0-9a-zA-Z-]+/)?(wp-.*)' to uri 'app/wp-admin/network/options.php',
rewrite 'app/wp-admin/network/options.php' -> '/app/wp-admin/network/options.php',
И это продолжается и продолжается... до предела 10 перенаправлений

Чтобы избежать такого поведения, вам нужно добавить некоторое ограничение на ваши правила, чтобы убедиться, что они не будут оценены, когда они не должны. Простой обходной путь - использовать отрицательный шаблон lookahead, чтобы убедиться, что текущий запрос не начинается с/app/, прежде чем переписать его:

RewriteRule ^((?!app/)[^/]+/)?(wp-.+)$ /app/$2 [L]  

Наконец, ваш htaccess может выглядеть следующим образом

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

RewriteRule ^index\.php$ - [L]

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]

# Rule 1
RewriteRule ^([^/]+/)?files/(.+)$ wp-includes/ms-files.php?file=$2 [L]

# Rule 2
RewriteRule ^((?!app/)[^/]+/)?(wp-.+)$ /app/$2 [L,QSA]

# Rule 3
RewriteRule ^((?!app/)[^/]+/)?(.+\.php)$ /app/$2 [L,QSA] 

RewriteRule ^ index.php [L]

Options -Indexes
</IfModule>
# END WordPress

Напоминание: 3 правила выполняются только для несуществующих файлов / папок.

Примеры:

  • http://domain.tld/files/something или http://domain.tld/xxx/files/something будет внутренне переписано к /wp-includes/ms-files.php?file=something благодаря правилу 1
  • http://domain.tld/wp-something/somethingelse или http://domain.tld/xxx/wp-something/somethingelse (где xxx может быть чем угодно, кроме app) будут внутренне переписаны на /app/wp-something/somethingelse благодаря правилу 2
  • http://domain.tld/file.php или http://domain.tld/xxx/file.php (где xxx может быть чем угодно, кроме app) будут внутренне переписаны на /app/file.php благодаря правилу 3