Apache 子目录中的.htaccess不';t在规则后面工作
在我的服务器(Apache 2.2)上,我有以下结构: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
/.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]