我已经使用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,但我无法确定。)