views:

84

answers:

2

I want to be able to rewrite this

http://localhost/.../identicon/f528764d624db129b32c21fbca0cb8d6.png

to

http://localhost/.../identicon.php?hash=f528764d624db129b32c21fbca0cb8d6

so I add to the /.../.htaccess so this is it:

RewriteEngine On
RewriteRule ^resource/ - [L]
RewriteRule ^identicon/(.+)\.png$ identicon.php?hash=$1 [QSA,L]
RewriteRule ^(.*)$ index.php?t=$1 [QSA,L]

Which doesn't work for some reason because it redirects it to index.php?t=identicon.php; even though the L flag is set! Why?

A: 

(Not correct answer; left for reference)


I just figured out what may be the issue - it's something that thwarted me for a long time.

Depending on your server settings, it very well may be interpreting identicon/xxx.png as a request to identicon.php/xxx.png, assuming that the PHP extension is what you wanted. Try going to /index instead of /index.php - if it loads the PHP file, this is the issue affecting you.

This is the MultiViews Apache option, and it's stupid, but it has to be enabled specifically. Go into your site configuration file and see where it is enabled, and remove it.

If you don't have total control over your server configuration, the following may work in .htaccess (depending, ironically, on your server configuration).

Options -Multiviews
Matchu
I made index.php dump the value of $_GET['t'] to the screen: `index/a.png` prints `index/a.png`, but `identicon/a.php` just dumps `identicon.php`. Also, I tried changing "identicon" in the RewriteRule to something else and it still failed.
MiffTheFox
And no, MultiViews isn't enabled.
MiffTheFox
+1  A: 

Add a condition to the last rule to exclude requests that can be mapped to existing files:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?t=$1 [QSA,L]

That is necessary because the L flag generates an internal redirect with the new URL as the request URL:

Remember, however, that if the RewriteRule generates an internal redirect (which frequently occurs when rewriting in a per-directory context), this will reinject the request and will cause processing to be repeated starting from the first RewriteRule.

Gumbo