Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果路径上存在文件,Apache不会重写请求_Apache_Mod Rewrite - Fatal编程技术网

如果路径上存在文件,Apache不会重写请求

如果路径上存在文件,Apache不会重写请求,apache,mod-rewrite,Apache,Mod Rewrite,我正在对每个与现有文件或目录不匹配的请求使用mod_rewrite进行重写。这是我的配置: RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^.*$ /index.php [NC,L] 这用于将类似/abc/foo或/abc/foo/10的URL映射到我的应用程序。而且效果很好 为了提高性能,我的应用程序现在将调用/abc/foo的结果存储在

我正在对每个与现有文件或目录不匹配的请求使用mod_rewrite进行重写。这是我的配置:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ /index.php [NC,L]
这用于将类似
/abc/foo
/abc/foo/10
的URL映射到我的应用程序。而且效果很好

为了提高性能,我的应用程序现在将调用
/abc/foo
的结果存储在相应目录
/abc
中的文件
foo
中,这样在第一次调用后,重写条件不再适用(文件不存在),apache直接提供数据,而无需首先调用应用程序。效果也不错

问题是:请求
/abc/foo/10
现在不再导致URL被重写,而是出现错误“404未找到文件”。日志条目说明重写条件
-f
不再为真,但实际上文件
/abc/foo/10
不存在
/abc/foo
存在,但它是一个文件,而不是目录

我怎样才能让它工作


(多视图已禁用)

您必须处于启用了/AcceptPathInfo的per dir/htaccess上下文中

因此,REQUEST_FILENAME与存在的部分匹配,并且与REQUEST_URI不同

如果您不关心请求之前在您的rewritecond中映射到哪里,请使用REQUEST_URI变量


在每个vh上下文中,这些变量总是相同的。

这是因为foo作为一个文件存在,apache为foo提供额外的/10作为查询字符串传递。因此,您的应用程序应该向foo文件中写入一些额外的代码,这也会检查请求是否包含一些额外的url组件,然后处理目录“foo”的创建文件10。

项目设计有点错误-其他人已经指出它不可伸缩-如果已经有/abc/foo文件,您如何缓存对/abc/foo/10的请求

解决这个问题的办法是使用子文件夹而不是文件

因此,与以下内容的缓存结构不同:

/abc/foo
/abc/bar
 ...?
使用:

每次都使用index.html创建新目录

这一次Apache会发现其中有/abc/foo文件夹,但没有/abc/foo/10文件,因此将应用RewriteCond

编辑

您也可以尝试另一种方法-使用mod_rewrite修改url,更改url:

/abc/foo
/abc/bar
/abc/foo/10
例如:

/cache/abc~foo
/cache/abc~bar
/cache/abc~foo~10
htaccess规则(大致):


您的标准htaccess规则应该遵循

让我更正一下,因此当您发出请求时,
/abc/foo/10
,您希望数据也被写入foo下/abc下的文件夹,并写入名为10的文件?即使在第二次调用中,这也是您所期望的吗?不,问题是如果文件
/abc/foo
存在,则对
/abc/foo/10
的调用不再匹配
RewriteCond%{REQUEST\u FILENAME}-f
。为什么不把
重写cond%{REQUEST\u FILENAME}-d
首先,然后
重写cond%{REQUEST_FILENAME}-f
查看结果,并将重写规则^(.*)$改为^.*$,并将其直接指向index.php而不是/index.phpThanks。感谢您的想法,但这并没有改变任何事情。我不熟悉“AcceptPathInfo”,停用它会有帮助吗?有没有机会告诉Apache不要这样做?谢谢!实际上,我已经重构了整个缓存系统,但仍然很好奇为什么Apache会这样做。
/cache/abc~foo
/cache/abc~bar
/cache/abc~foo~10
# redirecting to cache folder and removing last '/'
RewriteCond %{REQUEST_URI} ^/(abc|cde)
RewriteRule ^(.*?)/?$ /cache/$1 [L]

# recursive replacing '/' with '~'
RewriteCond %{REQUEST_URI} ^/cache/.*/
RewriteRule cache/(.*)/(.*)$ /cache/$1~$2 [L]