[prev in list] [next in list] [prev in thread] [next in thread] 

List:       apache-httpd-users
Subject:    [users@httpd] Rewrite rules in .htaccess: Internal redirect loop
From:       Thomas Ulrich <tu.datamedia () outlook ! de>
Date:       2016-04-15 22:48:25
Message-ID: DB5PR0601MB1990B4618FC2CC6A012B621CE7680 () DB5PR0601MB1990 ! eurprd06 ! prod ! outlook ! com
[Download RAW message or body]

Hi everyone, 

I'm trying to track down a problem with rewrite rules. I have set up a WordPress \
multisite installation. In the root directory of this installation, there's a \
.htaccess file which contains some rewrite rules. I've copy&pasted the content of the \
.htaccess file to the bottom of this email.

The problem is: When someone requests a non-existent file in /wp-content/ or one of \
its subfolders, like http://foo.bar/wp-content/non-existent-file.txt, or
http://foo.bar/subdir/wp-content/non-existent-file.txt
then they end up with an error 500 and the following message appears in my error.log: \
"Request exceeded the limit of 10 internal redirects due to probable configuration \
error."

Expected behaviour would be that Apache serves an error 404 page.

This problem has been reported in the WordPress bugtracker, but there's some \
confusion on what the ideal fix should look like: \
https://core.trac.wordpress.org/ticket/20746

It has been suggested in the discussion on that ticket that there's a problem with \
this directive: RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]

This rewrite rule is supposed to rewrite request URIs like \
"/subdir/wp-content/something" to "/wp-content/something". Moreover, I think that \
it's supposed to prevent request URIs like "/wp-content/something" from being \
rewritten to "index.php" by the last rewrite rule. Expected behaviour would be that \
such requests are served by Apache without invoking WordPress. 

I understand that request URIs like /wp-content/something match the pattern of the \
above rewrite rule. I don't understand, though, why the redirect loop occurs. \
Shouldn't this rewrite rule leave URIs like /wp-content/something unchanged (because \
the substituted URI is the same as the original URI)? And shouldn't Apache stop the \
rewriting process if a request URI hasn't been changed during the latest loop through \
.htaccess? 

This is the content of my .htaccess file, which is located in the root directory of \
my WordPress installation:

RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]

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

# add a trailing slash to /wp-admin
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]

# don't rewrite if request URI points to existing file or folder
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]

# Is there something wrong with these?
RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
RewriteRule . index.php [L]

Greets, 
Thomas
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@httpd.apache.org
For additional commands, e-mail: users-help@httpd.apache.org


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic