我有一个重写规则,它适用于除 lib 文件夹之外的所有内容。规则是
RewriteRule ^/uk(.*) $1
这是一组非常复杂的规则之一,但我已禁用除此以外的所有规则。此规则适用于除 lib 文件夹内容之外的所有内容:
http://site.local/lib/cookies.js有效,但是http://site.local/uk/lib/cookies.js没有。
网站上的所有其他路径都可以重定向,例如:
http://site.local/uk/course/view.php?id=15去http://site.local/course/view.php?id=15
- 名称中只有三个字母的其他文件夹也可以使用。
- uk/otherpath/lib 有效。
- lib文件夹中没有htaccess文件
- 站点根目录中没有 htaccess 文件(规则在虚拟主机定义中)
- 该问题发生在 Ubuntu 和 RedHat(开发和生产)上
- 该问题发生在同事工作站上的另一个 moodle 网站上
- lib 文件夹的权限与目录树的其余部分相同
我错过了什么?
- - 编辑 - -
RewriteLog "/var/log/apache2/rewrite.log"
RewriteLogLevel 9
给我
127.0.0.1 - - [22/Sep/2011:11:21:57 +0100] [site.local/sid#7f15a0b345d0][rid#7f15a0e1b270/initial] (2) init rewrite engine with requested uri /uk/lib/cookies.js
127.0.0.1 - - [22/Sep/2011:11:21:57 +0100] [site.local/sid#7f15a0b345d0][rid#7f15a0e1b270/initial] (3) applying pattern '^/uk(.*)' to uri '/uk/lib/cookies.js'
127.0.0.1 - - [22/Sep/2011:11:21:57 +0100] [site.local/sid#7f15a0b345d0][rid#7f15a0e1b270/initial] (2) rewrite '/uk/lib/cookies.js' -> '/lib/cookies.js'
127.0.0.1 - - [22/Sep/2011:11:21:57 +0100] [site.local/sid#7f15a0b345d0][rid#7f15a0e1b270/initial] (2) local path result: /lib/cookies.js
127.0.0.1 - - [22/Sep/2011:11:21:57 +0100] [site.local/sid#7f15a0b345d0][rid#7f15a0e1b270/initial] (1) go-ahead with /lib/cookies.js [OK]
127.0.0.1 - - [22/Sep/2011:11:21:57 +0100] [site.local/sid#7f15a0b345d0][rid#7f15a0e232b0/initial] (2) init rewrite engine with requested uri /favicon.ico
127.0.0.1 - - [22/Sep/2011:11:21:57 +0100] [site.local/sid#7f15a0b345d0][rid#7f15a0e232b0/initial] (3) applying pattern '^/uk(.*)' to uri '/favicon.ico'
127.0.0.1 - - [22/Sep/2011:11:21:57 +0100] [site.local/sid#7f15a0b345d0][rid#7f15a0e232b0/initial] (1) pass through /favicon.ico
所以在我看来这应该可行?
答案1
这个问题在 serverfault 上得到了回答。事实证明,存在一些可怕的默认行为,即如果您在虚拟主机中编写规则并且没有明确重定向到以 %{DOCUMENT_ROOT} 开头的路径,它会首先在文件系统的根目录中查找匹配的路径。我在下面附加了答案:
在我的本地机器上处理这个问题之后,似乎 Apache 在检查 document_root/lib 目录之前正在重写文件系统上的 /lib。
您应该将重写内容更改为:
RewriteRule ^/uk(.*) %{DOCUMENT_ROOT}$1