我的 Apache 2.2.4 服务器在 access_log 中有很多类似这样的消息:
::1 - - [15/May/2010:19:55:01 +0200] "OPTIONS * HTTP/1.0" 400 543
::1 - - [15/May/2010:20:22:17 +0200] "OPTIONS * HTTP/1.0" 400 543
::1 - - [15/May/2010:20:24:58 +0200] "OPTIONS * HTTP/1.0" 400 543
::1 - - [15/May/2010:20:25:55 +0200] "OPTIONS * HTTP/1.0" 400 543
::1 - - [15/May/2010:20:27:14 +0200] "OPTIONS * HTTP/1.0" 400 543
这些是本页解释的“内部虚拟连接”:
http://wiki.apache.org/httpd/InternalDummyConnection
该页面也触及了我主要的问题:“在 2.2.6 及更早版本中,在某些配置下,这些请求可能会触及重量级的动态网页并导致服务器不必要的负载。您可以使用 mod_rewrite 在使用该特定用户代理或 IP 地址访问时以重定向进行响应来避免这种情况。“
好吧,显然我不能使用 UserAgent,因为我最小化了服务器签名,但我可以使用 IP 地址。但是,我不知道 RewriteCond 和 RewriteRule 应该如何查找 IPv6 地址 ::1。
运行此程序的网站使用 CodeIgniter,因此已经有以下 .htaccess,我只需要添加它:
RewriteEngine on
RewriteCond %{REQUEST_URI} ^/system.*
RewriteRule ^(.*)$ /index.php?/$1 [G]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?/$1 [L]
知道如何编写此 .htaccess 规则吗?
解决了:添加另一条规则会使 OPTIONS 不符合当前规则,并且以与 Apache 默认相同的方式处理。
RewriteEngine on
RewriteCond %{REQUEST_URI} ^/system.*
RewriteRule ^(.*)$ /index.php?/$1 [G]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REMOTE_HOST} !^::1$
RewriteRule ^(.*)$ /index.php?/$1 [L]
我从未通过 IPv6 上的本地主机访问网站,所以这个功能很好。
答案1
RewriteCond %{REMOTE_HOST} ^::1$
RewriteRule ^OPTIONS http://www.google.com/ [L]
这是我最好的猜测,我确信RewriteCond
,但并不完全是RewriteRule
它将匹配现有内容REMOTE_HOST
,然后重写对以www.google.com::1
开头的任何 URL 的请求OPTIONS