mod_rewrite misbehaves if regex matches existing file, but only in .htaccess file

元气小坏坏 提交于 2019-12-25 02:21:03

问题


I've got an .htaccess rule like this:

RewriteRule    ^z/([^/]+)$    y.html?$1    [NC,L]

This rule works fine. But if I change the rule slightly, to:

RewriteRule    ^y/([^/]+)$    y.html?$1    [NC,L]

When I try to load y/anything I get a 404 and the following message in the error log:

File does not exist: /var/www/y.html/anything

The only difference I can see is that z.html does not exist, but y.html does. At first I thought maybe the initial transform was triggering a recursive re-write, but I don't see how this could be. It should rewrite:

`y/anything`

to

`y.html?anything`

Which does NOT have a slash in it. In fact, the only problem with the re-written URL is that it has a slash where I specified a question mark. What is going on here?

It gets stranger. If I change the rewrite URL, e.g. to

RewriteRule    ^y/([^/]+)$    /q.html?$1    [NC,L] 

it STILL is telling me /var/www/y.html/anything not found, not q.html..

If I move y.html to y.js on the server, then it tells me /var/www/y.js/anything is not found. It really seems like it is somehow matching /dir/ and changing it to an existing file. Is there a default rule somewhere in apache that might do this?

I tried a hard reload in the browser, which had no effect.

Update: I tried to use RewriteLog to see what was going on with the re-writing. However, to do this I had move my rewrite entries to the VirtualHost section of my main config. After I did this the pattern matching completely stopped until I changed my rule to:

RewriteRule    ^/y/([^/]+)$    /y.html?$1    [NC,L]

After making this change, everything works as expected. So why can't I get it to work in the .htaccess file? Neither regex works properly there (with or without the leading slash).


回答1:


For anyone who runs into this problem in the future, the issue I was having was that MultiViews was interfering with my URL resolution. When I removed "MultiViews" from the list of options for the <Location/> in the <VirtualHost> the issue went away.




回答2:


Having the following in the htaccess file

RewriteEngine On                                                           
RewriteRule    ^z/([^/]+)$    /y.html?$1    [NC,L]
RewriteRule    ^y/([^/]+)$    /y.html?$1    [NC,L]

will show the contents of y.html

You might want to do a hard refresh of the page because if it was previously redirected to /y.html/anything, but then changed to /y.html?anything it might still be in a cache on your browser. Double check with your other browsers that the same thing is happening on them.



来源:https://stackoverflow.com/questions/22725584/mod-rewrite-misbehaves-if-regex-matches-existing-file-but-only-in-htaccess-fil

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!