httpd RewriteRule 没有按预期工作
httpd RewriteRule not working as expected
在我的服务器上,我是 运行 awstats,我目前可以通过以下 URL:
访问的脚本
我正在尝试使用重写规则,这样我就可以使用
这是我为重写规则定义的
RewriteRule ^(.*)$ bin/awstats.pl/?config= [NC,L]
httpd虚拟主机
# Address
ServerName stats.example.com
# Rewrite
RewriteRule ^(.*)$ bin/awstats.pl/?config= [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= [NC,L]
我现在可以使用
再次加载页面
https://stats.example.com/bin/awstats.pl/?config=www.example.com
这意味着可以正确加载所有资源,但是
将 return 一个 400(这不是来自 pl 脚本,如果找不到指定的配置文件,它将 return 一个 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 日志中没有任何错误。
我强烈怀疑对索引以外的文档的请求被非常宽容的 (.*)
错误地捕获并错误地发送到 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= [L,NC]
上面我使用 [a-z0-9]+\.
来匹配评论线程中提到的 3 部分 FQDN 字符串。这可能需要进一步完善。例如,为了也支持字符串 "global"
,您可以将其扩展为
RewriteRule ^(global|[a-z0-9]+\.[a-z0-9]+\.[a-z0-9]+)$ bin/awstats.pl?config= [L,NC]
在我的服务器上,我是 运行 awstats,我目前可以通过以下 URL:
访问的脚本我正在尝试使用重写规则,这样我就可以使用
这是我为重写规则定义的
RewriteRule ^(.*)$ bin/awstats.pl/?config= [NC,L]
httpd虚拟主机
# Address
ServerName stats.example.com
# Rewrite
RewriteRule ^(.*)$ bin/awstats.pl/?config= [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= [NC,L]
我现在可以使用
再次加载页面https://stats.example.com/bin/awstats.pl/?config=www.example.com
这意味着可以正确加载所有资源,但是
将 return 一个 400(这不是来自 pl 脚本,如果找不到指定的配置文件,它将 return 一个 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 日志中没有任何错误。
我强烈怀疑对索引以外的文档的请求被非常宽容的 (.*)
错误地捕获并错误地发送到 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= [L,NC]
上面我使用 [a-z0-9]+\.
来匹配评论线程中提到的 3 部分 FQDN 字符串。这可能需要进一步完善。例如,为了也支持字符串 "global"
,您可以将其扩展为
RewriteRule ^(global|[a-z0-9]+\.[a-z0-9]+\.[a-z0-9]+)$ bin/awstats.pl?config= [L,NC]