Apache 2.4 默认设置,OS 7 没有 .htaccess,网站运行正常。URL 字符串包含本地化字符。我严格按照说明创建了一个 .htaccess 文件,以创建一个短 URL。加载页面时出现了一些错误:
(20023)The given path was above the root path: AH00127: Cannot map GET /%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0 HTTP/1.1 to file
(20023)The given path was above the root path: AH00127: Cannot map GET /favicon.ico HTTP/1.1 to file, referer: http://ru.techwik.org/%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0
.htaccess
RewriteEngine On
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d
RewriteRule ^(.*)$ %{DOCUMENT_ROOT}/index.php [L]
我找不到明确的答案,或者不明白某些事情。首先,我不清楚为什么我从一些说明中得到的这么简单的规则不起作用?为什么内部重定向到 index.php 不起作用?如何修复?其次,为什么 RewriteRuke 无法与本地化转义页面一起使用?(错误 20024)可以以某种方式修复吗?
答案1
RewriteRule ^(.*)$ %{DOCUMENT_ROOT}/index.php [L]
您只能重写为绝对文件系统路径服务器(或者虚拟主机) 上下文。其中.htaccess
是相对于文档根目录的 URL 路径(以斜杠为前缀时)。(浏览器中收到什么响应?403?)
因此,在 中.htaccess
,该指令应这样写:
RewriteRule ^(.*)$ /index.php [L]
或者,完全省略斜杠前缀(即index.php
),这样它就是相对于文件的目录.htaccess
(除非RewriteBase
另有说明)。
在旁边:没有必要在RewriteRule
图案(即(.*)
)。正则表达式^(.*)$
遍历整个 URL 路径并保存以供以后使用(作为$1
反向引用)。如果您只想匹配任何事物(而不是一切) 则使用^
(字符串锚点的开始) 或.?
(可选字符) 或$
(字符串锚点的结束)。虽然您可以通过检查.
(单个字符) 来避免在请求文档根目录时进行不必要的文件系统检查。例如:
RewriteRule . index.php [L]
这确实假设index.php
被定义为DirectoryIndex
。