1

我正在尝试使用此 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

我的范围是允许使用 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 参数解决吗?

4

2 回答 2

1

如果文件名包含?.

RewriteEngine On
RewriteCond %{QUERY_STRING} (.+)
RewriteRule ^(index\.php)$ $1\%3F%1 [L]

它的工作原理如下:

  • RewriteRule首先评估,匹配存储在 $0, $1, ...
  • 成功后,RewriteCond进行评估并将匹配存储在 %0, %1, ...
  • 最后,将两场比赛结合起来
  • 文字%字符被转义为\%(必要的,因为%n用于 RewriteCond 反向引用)
  • %3F是 URL 编码形式?,否则表示查询字符串的开头
  • .+用于匹配非空查询字符串
于 2013-02-11T18:54:04.787 回答
0

请参阅 --restrict-file-names 选项。虽然不完全用于此特定目的,但 --restrict-file-names=windows 可能会帮助您:

--restrict-file-names=模式

更改在生成本地文件名期间必须对远程 URL 中的哪些字符进行转义。[...]

当给出“windows”时,Wget 会转义字符 \、|、/、:、?、"、*、<、> 以及 0--31 和 128--159 范围内的控制字符。除此之外, Windows 模式下的 wget 使用 + 代替 : 来分隔本地文件名中的主机和端口,并使用 @ 代替 ? 将文件名的查询部分与其余部分分隔。因此,将保存为 www 的 URL。 xemacs.org:4300/search.pl?input=blah 在 Unix 模式下将被保存为 www.xemacs.org+4300/search.pl@input=blah 在 Windows 模式下。

于 2013-04-11T01:33:23.243 回答