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 ответ:
У вас есть цикл перенаправления из-за этих правил
На самом деле, вы должны иметь в виду, что ваши правила оцениваются даже после перезаписи. Таким образом, если у вас есть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',
Тогда у вас есть
И это продолжается и продолжается... до предела 10 перенаправлений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',
Чтобы избежать такого поведения, вам нужно добавить некоторое ограничение на ваши правила, чтобы убедиться, что они не будут оценены, когда они не должны. Простой обходной путь - использовать отрицательный шаблон 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
благодаря правилу 1http://domain.tld/wp-something/somethingelse
илиhttp://domain.tld/xxx/wp-something/somethingelse
(гдеxxx
может быть чем угодно, кромеapp
) будут внутренне переписаны на/app/wp-something/somethingelse
благодаря правилу 2http://domain.tld/file.php
илиhttp://domain.tld/xxx/file.php
(гдеxxx
может быть чем угодно, кромеapp
) будут внутренне переписаны на/app/file.php
благодаря правилу 3