1

在工作中,我们有一个 ViewVC 系统,它已从一台机器迁移到另一台机器。版本也升级了。旧系统用作/cgi-bin/viewvc.cgi其所有 url 的基础,新系统使用/viewvc. 主机名保持不变。

我们有很多包含 ViewVC 链接的文档,我希望它们仍然像以前一样工作。我白天是一名软件开发人员,所以不是 apache 专家,但我认为那mod_rewrite是正确的途径。不幸的是,我似乎无法让它做我想做的事。

没有任何更改,当我转到 url 时,/cgi-bin/viewvc.cgi我得到一个 404。这是我在 apache 日志中看到的内容:

==> /var/log/httpd/error_log <==
[Thu May 31 03:13:10 2012] [error] [client 172.16.3.52] script not found or unable to stat: /var/www/cgi-bin/viewvc.cgi

==> /var/log/httpd/access_log <==
172.16.3.52 - - [31/May/2012:03:13:10 +0100] "GET /cgi-bin/viewvc.cgi HTTP/1.1" 404 289 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.17 Safari/536.11"

当我将RewriteEngine/RewriteRule条目添加到/etc/httpd/httpd.conf如下...

<Directory "/var/www/cgi-bin">
    AllowOverride None
    Options None
    Order allow,deny
    Allow from all

    RewriteEngine on
    RewriteRule ^/cgi-bin/viewvc.cgi(.*) /viewvc$1
</Directory>

我得到一个 403。这是日志中的内容:

==> /var/log/httpd/error_log <==
[Thu May 31 03:15:35 2012] [error] [client 172.16.3.52] Options FollowSymLinks or SymLinksIfOwnerMatch is off which implies that RewriteRule directive is forbidden: /var/www/cgi-bin/viewvc.cgi

==> /var/log/httpd/access_log <==
172.16.3.52 - - [31/May/2012:03:15:35 +0100] "GET /cgi-bin/viewvc.cgi HTTP/1.1" 403 293 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.17 Safari/536.11"

如果我编辑上面的选项行以包含FollowSymLinks并且SymLinksIfOwnerMatch我回到 404。

==> /var/log/httpd/error_log <==
[Thu May 31 03:17:20 2012] [error] [client 172.16.3.52] script not found or unable to stat: /var/www/cgi-bin/viewvc.cgi

==> /var/log/httpd/access_log <==
172.16.3.52 - - [31/May/2012:03:17:20 +0100] "GET /cgi-bin/viewvc.cgi HTTP/1.1" 404 289 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.17 Safari/536.11"

我究竟做错了什么?我的规则是错的还是放错了地方?mod_rewrite甚至他是正确的做法吗?

版本:如果它很重要,我在 Fedora 17 机器上使用以下软件包:

  • httpd-2.2.22-4.fc17.x86_64
  • viewvc-1.1.13-2.fc17.noarch
  • viewvc-httpd-wsgi-1.1.13-2.fc17.noarch
4

1 回答 1

0

为了回答我自己的问题,问题是 1)模式匹配中的句点需要转义,以及 2)我把规则放在了错误的位置。我应该把它放在顶层而不是 cgi-bin 下。


为了完成,这是我的工作方式:

我打开了重写日志,所以我可以确切地看到重写引擎在做什么:

RewriteLog /tmp/rewrite.log
RewriteLogLevel 9

使用原始的重写规则,我得到了这个被记录:

127.0.0.1 - - [02/Jun/2012:23:43:49 +0100] [localhost/sid#b76f4018][rid#b6d4a058/initial] (2) init rewrite engine with requested uri /cgi-bin/viewcvs.cgi
127.0.0.1 - - [02/Jun/2012:23:43:49 +0100] [localhost/sid#b76f4018][rid#b6d4a058/initial] (3) applying pattern '^/cgi-bin/viewvc.cgi(.*)' to uri '/cgi-bin/viewcvs.cgi'
127.0.0.1 - - [02/Jun/2012:23:43:49 +0100] [localhost/sid#b76f4018][rid#b6d4a058/initial] (1) pass through /cgi-bin/viewcvs.cgi

当我更改规则以逃避期间:

RewriteRule ^/cgi-bin/viewvc\.cgi(.*) /viewvc$1

我得到了这个记录。

192.168.1.64 - - [03/Jun/2012:00:08:53 +0100] [192.168.1.128/sid#b76ed018][rid#b6d39058/initial] (2) init rewrite engine with requested uri /cgi-bin/viewvc.cgi/
192.168.1.64 - - [03/Jun/2012:00:08:53 +0100] [192.168.1.128/sid#b76ed018][rid#b6d39058/initial] (3) applying pattern '^/cgi-bin/viewvc\.cgi(.*)' to uri '/cgi-bin/viewvc.cgi/'
192.168.1.64 - - [03/Jun/2012:00:08:53 +0100] [192.168.1.128/sid#b76ed018][rid#b6d39058/initial] (2) rewrite '/cgi-bin/viewvc.cgi/' -> '/viewvc/'

所以它是光秃秃的“。” 这使它不匹配。但根据文档,这是“任何单个字符”,所以我不清楚为什么它不起作用。

重写指南到处逃避它们,但没有表明它是必需的或为什么,这是一种耻辱。

于 2012-06-06T14:47:34.527 回答