我正在尝试用这个wget行创建一个静态的b2evolution站点:
wget -nv -b -m -k -p -E -erobots=off --tries=5 --exclude-directories=calendar,users,user --domains directory http://site.com
它产生这样的文件:
index.php?blog=2&cat=21.html
尝试访问此网址:
http://site.com/index.php?blog=2&cat=21.html
我在浏览器上发现了这个错误:
Not Found
The requested URL /index.php was not found on this server.
和error.log上的这个:
[Mon Feb 10 19:02:49 2013] [error] [client xx.xx.xx.xx] script '/var/www/site.com/htdocs/index.php' not found or unable to stat, referer: http://site.com/index.php
但我可以使用%3F代替“?”:
http://site.com/index.php%3Fblog=2&cat=21.html
我的范围允许使用旧的url(带'?')访问网站,使用apache rewrite_mod修改'?' '%3F'。我试过了:
RewriteRule ^index.php\? index.php\%3F [QSA,NE]
但我在日志中发现了这个错误:
Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace.
用mod_rewrite或其他wget参数解决任何想法吗?
答案 0 :(得分:1)
如果文件名包含?
,则以下规则应该有效。
RewriteEngine On
RewriteCond %{QUERY_STRING} (.+)
RewriteRule ^(index\.php)$ $1\%3F%1 [L]
它的工作原理如下:
RewriteRule
评估 优先 ,匹配存储在$ 0,$ 1,... RewriteCond
并将匹配项存储在%0,%1,... %
字符转义为\%
(因为%n
用于RewriteCond反向引用所必需的)%3F
是?
的网址编码形式,否则表示查询字符串的开头.+
用于匹配非空查询字符串答案 1 :(得分:0)
请参阅--restrict-file-names选项。虽然不完全是出于这个特定目的,但是--restrict-file-names = windows可能会帮助你:
- 限制文件 - 名称=模式
更改远程网址中找到的字符必须在转换过程中进行转义 生成本地文件名。 [...]
当给出“windows”时,Wget会转义字符\,|,/,:,?,“, *,<,>,以及范围0--31和128--159中的控制字符。除此之外,Windows模式下的Wget使用+而不是:to 在本地文件名中分隔主机和端口,并使用@而不是?至 将文件名的查询部分与其余部分分开。因此, 一个URL,保存为www.xemacs.org:4300/search.pl?input=blah 在Unix模式下将保存为 在Windows模式下www.xemacs.org+4300/search.pl@input=blah。