httpd RewriteRule没有按预期工作

时间:2016-01-20 02:16:40

标签: apache url-rewriting rewrite awstats

在我的服务器上,我正在运行awstats,这是我目前可以通过以下网址访问的脚本:

  

https://stats.example.com/bin/awstats.pl/?config=global

我正在尝试使用重写规则,以便我可以使用

  

https://stats.example.com/global

这是我为重写规则定义的内容

  

RewriteRule ^(。*)$ bin / awstats.pl /?config = $ 1 [NC,L]

httpd虚拟主机

# Address
ServerName              stats.example.com

# Rewrite
RewriteRule      ^(.*)$ bin/awstats.pl/?config=$1 [NC,L]

Options                 ExecCGI
AddHandler              cgi-script .cgi .pl
Alias                   /awstatsstuff "/path/to/awstatsstuff/"

<Directory "/path/to/awstatsstuff">
        Options ExecCGI
        AllowOverride None
        Order allow,deny
        Allow from all
</Directory>

问题是我尝试访问的任何内容(除了索引)都会给我400,而我的apache日志显示没有错误。

如果此规则正常运行,我是否有其他配置问题?或者我错过了什么?是的,RewriteEngine已开启。

修改

基于Michael Berkowski的评论我确定 实际上是一个问题,资源也被定向到pl脚本,我已经修改并使用以下内容:

RewriteCond             %{REQUEST_FILENAME} !-d
RewriteCond             %{REQUEST_FILENAME} !-f
RewriteRule             ^/([0-9a-z]+\.[0-9a-z]+\.[0-9a-z]+)$    bin/awstats.pl/?config=$1 [NC,L]

我现在可以使用

重新加载页面
  

https://stats.example.com/bin/awstats.pl/?config=www.example.com

这意味着可以正确加载所有资源

  

https://stats.example.com/www.exmaple.com

将返回400(这不会来自pl脚本,如果找不到指定的配置文件,它将返回200并显示错误消息,同样,日志中没有错误消息。

其他编辑

在将[NC,L]更改为[R=302]时,我会根据请求向您提供正确的重定向,

curl -k "https://stats.example.com/a.b.c"
...
<p>The document has moved <a href="https://stats.example.com/bin/awstats.pl/?config=a.b.c">here</a>.</p>
...

使用[R=403]证明重写规则按预期工作

我现在面临的问题是,在使用[NC,L]时,我仍然收到400,httpd日志中没有错误。

1 个答案:

答案 0 :(得分:1)

我强烈怀疑对索引以外的文档的请求被错误的(.*)错误地捕获并错误地发送给config=。然后,400(错误的请求)可能是因为awstats绊倒它无法处理的值。

应该发生两件事。首先,您需要从重写中排除实际存在的文件和目录,通常使用一对RewriteCond来完成。然后,使用更适合(.*)实际应该被视为有效的值的匹配器,而不是非常通用的config=匹配器。

# If the requested document is not a known
# file or directory on disk...
RewriteCond %{REQUEST_FILENAME} !=f
RewriteCond %{REQUEST_FILENAME} !=d

# Rewrite patterns matching only the expected
# config= values for awstats
RewriteRule ^([a-z0-9]+\.[a-z0-9]+\.[a-z0-9]+)$ bin/awstats.pl?config=$1 [L,NC]

上面我使用了[a-z0-9]+\.来匹配注释线程中提到的3部分FQDN字符串。这可能需要进一步细化。例如,要支持字符串"global",您可以将其扩展为

RewriteRule ^(global|[a-z0-9]+\.[a-z0-9]+\.[a-z0-9]+)$ bin/awstats.pl?config=$1 [L,NC]