2016-02-12 5 views
5

Piszę wtyczkę WordPress, która wykorzystuje ustawienia API z poziomu klasy. Więc klasa nazywa register_settings(), add_settings_field() i add_settings_section() od wewnątrz klasy, który działa dobrze z wyjątkiem, gdy próbuję wysłać formularz get błąd serwera z powodu następującego błędu w moich dziennikach:WordPress Multisite, niestandardowy folder zawartości wp i żądanie przekroczyły limit 10 wewnętrznych przekierowań

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. 

Instalacja mojego WordPressa jest nieco dziwna. Opiera się on na Mark Jaquith's WordPress Skeleton repo i przeniesiony został mój folder wp-content, mój plik wp-config.php poza WordPress.

Używam również WordPressa przez Vagrant, więc może to być problem z konfiguracją serwera. Jednak próbowałem użyć mojej wtyczki w VVV przy użyciu standardowej instalacji WordPressa i działającej idealnie.

katalog

My WordPressie wygląda następująco (kompozytor zainstalować WP do aplikacji dir):

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

Dodałem moje dzienniki przepisywania w pojemniku pasty: http://pastebin.com/QKCFjULZ

Mój plik .htaccess wygląda tak :

# 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 
+0

mam zawężony go nie jest to problem z klasą. Przeniosłem wszystkie funkcje API ustawień poza klasę i załadowałem je w standardowy sposób. – rugbert

Odpowiedz

1

masz pętlę przekierowania z powodu tych zasad

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

W rzeczywistości należy pamiętać, że zasady są oceniane nawet po przepisaniu. Tak więc, jeśli masz /something/wp-xxx/yyy/zzz, zostanie on przepisany wewnętrznie na /app/wp-xxx/yyy/zzz. Ale teraz, jak widzisz, twoja reguła znów będzie pasować do nowego uri /app/wp-xxx/yyy/zzz.

Dowód, patrząc na dzienników

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', 

Wtedy masz

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', 

i idzie dalej i dalej ... aż do limitu 10 przekierowań

Aby uniknąć tego problemu , musisz dodać pewne ograniczenia do swoich zasad, aby upewnić się, że nie będą one oceniane, gdy nie będą musiały. Prosty obejście byłoby użyć negatywny uprzedzoną wzór, aby upewnić się, że żądanie aktualnego ma nie zacząć /app/ przed przepisanie go:

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

Wreszcie, htaccess mógłby wyglądać następująco

# 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 

Przypomnienie : 3 reguły są wykonywane tylko w nieistniejących plikach/folderach.

Przykłady:

  • http://domain.tld/files/something lub http://domain.tld/xxx/files/something będzie wewnętrznie przepisany do /wp-includes/ms-files.php?file=something dzięki Artykuł 1
  • http://domain.tld/wp-something/somethingelse lub http://domain.tld/xxx/wp-something/somethingelse (gdzie xxx może być nic oprócz app) będzie wewnętrznie przepisany do /app/wp-something/somethingelse dzięki Reguła 2
  • http://domain.tld/file.php lub http://domain.tld/xxx/file.php (gdzie xxx może być nic oprócz app) będzie wewnętrznie przepisany do /app/file.php dzięki Artykuł 3
+0

Dzięki za to, przepraszam, że przegapiłem odpowiedź. Więc dodane reguły nie rozwiązały błędu rekursji. Zauważyłem, że adres URL w przeglądarce nigdy się nie zmienia, aby dołączyć/aplikację, więc Tylko dla mojej własnej wiedzy, co oznacza RewriteCond? jeśli% {THE_REQUEST} zawiera ten wzorzec, a następnie zastąpić go/app? – rugbert

+0

Odczytując ponownie pytanie, zauważyłem coś i zmodyfikowałem kod w mojej odpowiedzi. Przeczytaj uważnie przykłady na dole i powiedz, czy odpowiada to oczekiwanemu zachowaniu. W każdym razie, nie ważne co, nie powinno się ** już mieć pętli z tym kodem –

+1

Dzięki! Nie ma błędów rekursji, a strona jest znacznie szybsza. – rugbert

Powiązane problemy