Mod_rewrite破坏预先存在的目录

时间:2018-02-10 22:51:18

标签: apache mod-rewrite

我已经使用mod_rewrite多年了,但之前从未遇到过这种行为,现在让我挠头约两个小时了。

给定一个像这样的网站目录结构:

www/
 +-- .htaccess
 +-- image.py
 +-- images/
       +-- somefolder/
       |    +-- somefile.png
       +-- otherfolder/
            +-- otherfile.png

包含这么多的.htaccess文件:

RewriteEngine on
RewriteRule ^images/([a-zA-Z0-9_-]+)$ image.py?name=$1 [L,NC]

如果我请求的文件或文件夹与重写规则匹配但不存在,我会按预期进行重写:

http://example.com/images/foo          --> http://example.com/image.py?name=foo
http://example.com/images/other-folder --> http://example.com/image.py?name=other-folder

但是如果文件或文件夹确实存在,我会得到非常奇怪的结果:我希望规则适用或不适用,而不是&#34 ;没有变化"或"重写,"我得到了一个非常奇怪的部分重写网址:

http://example.com/images/somefolder   --> http://example.com/somefolder?name=somefolder

> GET /images/somefolder HTTP/1.1
> Host: www.example.com
> User-Agent: curl/7.54.1
> Accept: */*
< HTTP/1.1 301 Moved Permanently
< Date: Sat, 10 Feb 2018 22:39:29 GMT
* Server Apache is not blacklisted
< Server: Apache
< Location: https://www.example.com/images/somefolder/?name=somefolder

不存在其他.htaccess个文件,因此我无法解释为什么单行会产生如此奇怪的结果。

禁用Option -Multiviews(如此处所示:mod_rewrite doesnt work if file with same name as argument exists)无效。该问题与此处建议的问题类似(mod_rewrite, can't rewrite existing file),但我已将规则标记为[L]

所以有人知道为什么会这样吗?这是一个错误吗?有没有办法告诉Apache忽略&#34;真实&#34;目录,只是应用重写规则?或者我别无选择,只能重新设计我的网站以避免这个错误/怪癖?

(另外,这是一个共享主机,所以我甚至没有读取httpd.conf的访问权限,更不用说改变它的能力了,如果那里有东西的话造成这种情况。我的托管公司声称它运行的是Apache 2.2.22,但我无法确定。)

0 个答案:

没有答案