Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.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 子目录中的.htaccess不';t在规则后面工作_Apache_.htaccess - Fatal编程技术网

Apache 子目录中的.htaccess不';t在规则后面工作

Apache 子目录中的.htaccess不';t在规则后面工作,apache,.htaccess,Apache,.htaccess,在我的服务器(Apache 2.2)上,我有以下结构: /.htaccess /cache/test-uri/.htaccess /cache/test-uri/index.html 根目录上的htaccess/。htaccess: <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteCond "%{DOCUMENT_ROOT}/cache/%{REQUEST_URI}/index.h

在我的服务器(Apache 2.2)上,我有以下结构:

/.htaccess
/cache/test-uri/.htaccess
/cache/test-uri/index.html
根目录上的htaccess
/。htaccess

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteCond "%{DOCUMENT_ROOT}/cache/%{REQUEST_URI}/index.html%" -f
    RewriteRule .* "/cache/%{REQUEST_URI}/index.html" [L]
</IfModule>
<IfModule mod_headers.c>
    Header set X-Test "Test OK"
</IfModule>
/cache/test uri/index.html
内容是:

<html>
  <head></head>
  <body>Test OK</body>
</html>

测试正常
如果我在浏览器中打开
http://example.com/test-uri/
我在响应内容中看到了
Test OK
,但在响应标题中没有看到,这意味着根目录上的
.htaccess
可以工作,但是
/cache/Test uri/
文件夹中的
.htaccess
不能工作

如果我在浏览器中打开
http://example.com/cache/test-uri/
我在响应内容和响应标题中看到了预期的
测试OK
。这意味着
/cache/test uri/
文件夹中的
.htaccess
可以工作(如果直接调用而不是在重写规则后面调用)


问题是:.htaccess在重写规则之后不起作用?

原则上,这应该起作用(Apache 2.2和Apache 2.4都经过测试)。但是,TestString中确实存在一个错误,该错误将始终导致匹配失败:

RewriteCond
TestString末尾的
%
是一个文本
%
,因此此条件将始终失败

另外,
REQUEST\u URI
服务器变量始终以斜杠开头,因此您不应该在TestString和
RewriteRule
替换中包含额外的斜杠,否则将以双斜杠(
/
)结束。虽然Apache减少了多个斜杠以路由请求,但这些双斜杠仍然存在于多个服务器变量中(以及在内部请求中),因此,如果一些脚本不是预期的,这仍然会破坏它们

就个人而言,在
.htaccess
中,我会使用
重写规则
模式的反向引用,并保留斜杠。例如:

RewriteCond %{DOCUMENT_ROOT}/cache/$1/index.html -f
RewriteRule (.*) /cache/$1/index.html [L]

在Apache2.4上,这个场景似乎有效。内部重定向路径确实会影响上层htaccess。这是一个孤立的测试用例吗?任何其他指令或
.htaccess
文件?
/test uri
是根目录下的物理目录,还是请求URL完全是虚拟的?
RewriteCond %{DOCUMENT_ROOT}/cache/$1/index.html -f
RewriteRule (.*) /cache/$1/index.html [L]