我正在尝试创建一个 php 应用程序(具体来说是一个旧的 php Gallery 安装)的静态镜像。该应用程序生成如下 URL:
view_album.php?set_albumName=MyAlbum
wget
将这些直接下载到同名的文件中,并带有问号。为了不破坏入站链接,我想保留这些名称。但我该如何提供它们呢?我遇到了两个问题:
网络服务器(正确地)尝试查找“view_album.php”,并向其传递查询参数,而不是查找其中带有问号的文件。我如何告诉网络服务器查找其中带有问号的文件?重命名文件是不可取的,因为它会破坏入站链接。我无法告诉入站链接器对其 URL 进行 % 编码。
这些文件不以 HTML 结尾,因此大多数 Web 服务器不会发送 html 内容类型标头。我应该查找哪些配置参数来告诉它强制目录中的所有文件或匹配特定模式的文件使用“text/html”内容类型?
我最终使用 lighttpd,但如果您知道什么样的配置可以通过 apache/nginx 获得预期的结果,我也很想听听。
答案1
wget 将这些直接下载到名为相同的文件中,并带有问号。
您可以使用 禁用该行为--restrict-file-names=ascii,windows
,这可以直接在 wget 上解决您的问题,而无需花哨的服务器配置。
答案2
wget
我认为您也可以通过改变下载 php 文件的方式来解决这个问题:
wget -r --adjust-extension --convert-links 'http://example.com/index.php?foo=bar'
选项--adjust-extension
使wget
保存 PHP 文件时带有.html
扩展名,例如index.php?foo=bar.html
选项--convert-links
会将wget
下载文件中的链接转换为新创建的 .html 文件。请注意,此转换发生在后所有文件均已下载。
也可以看看:http://fvue.nl/wiki/Wget_storing_files_with_question_marks
答案3
我认为你可以mod_rewrite
在 Apache 中使用它来做到这一点。理想情况下,如果你告诉它mod_rewrite
做什么看起来就像无用的重写一样,你可以欺骗它认为它应该为名称包含查询字符串的文件提供服务。将类似这样的内容放入你的服务器配置中(不幸的是,不是在或.htaccess
块中<Directory>
)
RewriteEngine on
RewriteCond %{QUERY_STRING} (.*)
RewriteRule ^(.*) /path/to/webdir/$1?%1
我不知道这会对带有多个问号的 URL 产生什么影响。我认为它还会将问号附加到没有查询字符串的 URL 上。您可以将第一个正则表达式更改为(.+)
,但这样它就会从带有空查询字符串的 URL 中删除问号。
如果这不起作用,您可以将文件重命名为没有问号的名称(例如,将它们全部更改为 %s 或类似的),然后使用:
RewriteEngine on
RewriteCond %{QUERY_STRING} (.*)
RewriteRule ^(.*) /path/to/webdir/$1\%%1
我不知道这如何处理 PATH_INFO。如果 Gallery 使用它,你可能需要添加类似
RewriteCond %{PATH_INFO} (.*)
RewriteRule ^(.*) /path/to/webdir/$1/%1
(但如果 Gallery 同时使用“http://.../index.php“ 和 ”http://.../index.php/foobar“,因为您不能让文件系统上的 index.php 同时成为文件和目录。您可以通过进行更多名称混合来解决这个问题。)
当我们投入大量 mod_rewrite 时,不妨使用它来设置 MIME 类型:
RewriteRule \.php - [T=text/html]
或者
RewriteCond %{REQUEST_FILENAME} \.jpg$
RewriteRule ^ - [T=image/jpeg]
或类似的东西。(请注意,如果相册或照片名称包含“.php”等,第一个会如何中断。)
让我们知道结果如何!