开发者

htaccess rewrite not working for all rules

This is a very strange problem, and I just hope that I can clearly explain it.

Basically, we made a major update on a client site today, and needed to update some rewrite rules in the htaccess to accomodate the new structure, etc...

So, where we originally had things like:

RewriteRule ^/resources/?$  index.php?id=resources
RewriteRule ^/media/?$      media.php

We changed to:

RewriteRule ^/resources/?$  index.php?id=resources
RewriteRule ^/media/?$      index.php?id=media

But when we visited http://www.example.com/media - it was displaying the old media page. Then, when we removed the old media.php from the document root, we got 404s. Something somewhere is still mapping /media to media.php - and ignoring the rewrite rule.

The weird thing is - all the other rewrite rules in the file are working fine - and there are about 20 or so in there.

We've tracked up and down the vhost and other 开发者_开发百科config files, but can't find any reference to media or the other broken redirects (three in total) - so we're stumped.


I strongly suspect this would be due to AcceptPathInfo, which in my view is an Apache mis-feature. By default I believe it is switched on where PHP is the handler.

Try adding to your .htaccess, or preferably your httpd.conf (and restart):

AcceptPathInfo Off

See: http://httpd.apache.org/docs/2.2/mod/core.html#acceptpathinfo

--

A few side points:

You should ensure that your RewriteRules always end with [L] when you have found a match - it will help in debugging. E.g.:

RewriteRule ^/media/?$      index.php?id=media [L]

Also, you could reduce the number of rules by combining similar ones; e.g.:

RewriteRule ^/(media|resources)/?$  index.php?id=$1 [L]

Personally I think the use of /? at the end of your first-half is not good, because it means that both URLs work, without redirection, meaning that you do not have a definitive one that is 'correct'. Personally I would use:

RewriteRule ^/(media|resources)/$  index.php?id=$1 [L]
RewriteRule ^/(media|resources)$ /$1/ [L,R]

In other words, a unique resource should have a single, canonical (definitive) URL.


Disabling the MultiViews option in the site .htaccess fixed the issue - it seemed that this was enabling content negotiation which was being processed before the rewrite rules.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜