我试图创build一个PHP应用程序的静态镜像(特别是一个旧的PHP画廊安装)。 该应用程序产生的URL如下:
view_album.php?set_albumName=MyAlbum
wget直接将这些文件下载到名称相同的文件中,并带有问号。 为了不打破入站链接,我想保留这些名称。 但是,我如何为他们服务呢? 我遇到了两个问题:
Web服务器(正确)尝试查找“view_album.php”,并将查询parameter passing给它,而不是find一个带有问号的文件。 如何告诉Web服务器在其中查找带有问号的文件? 重命名文件是不可取的,因为它会打破入站链接。 我无法告诉入站链接器%编码它们的URL。
这些文件不以HTML结尾,所以大多数networking服务器不会发送html内容types的头文件。 我应该寻找什么样的configuration参数来告诉它为一个目录中的所有文件强制使用“text / html”内容types还是匹配某种模式?
我最终使用lighttpd,但如果你知道什么样的configuration可能会得到与Apache / Nginx所需的结果我也很想听到。
我想你也可以通过改变wget下载php文件的方式来解决这个问题:
wget -r --adjust-extension --convert-links 'http://example.com/index.php?foo=bar'
选项--adjust-extension使wget保存带有.html扩展名的PHP文件,例如index.php?foo=bar.html
选项--convert-links使wget将下载文件中的链接转换为新创build的.html文件。 请注意,所有文件下载后都会进行此转换。
另见: http : //fvue.nl/wiki/Wget_storing_files_with_question_marks
wget将这些直接下载到名称相同的文件中,并带有问号。
你可以使用--restrict-file-names=ascii,windows来禁用这个行为,这样可以解决你在wget上的问题,而不需要花哨的服务器configuration。
我想你可以在Apache中使用mod_rewrite来做到这一点。 理想情况下,如果你告诉mod_rewrite做一些看起来像无用的重写,你可以欺骗它,认为它应该提供一个名称包含查询string的文件。 把这样的东西在你的服务器configuration(不幸的是,在.htaccess或<Directory>块)
RewriteEngine on RewriteCond %{QUERY_STRING} (.*) RewriteRule ^(.*) /path/to/webdir/$1?%1
我不知道这会对具有多个问号的url产生什么影响。 我认为它也会附加一个问号到没有查询string的URL。 您可以将第一个正则expression式更改为(.+) ,但是它会使用空的查询string从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 ”,那么你就会发生冲突,因为你不能索引文件系统上的.php既是文件也是目录,你可以通过做更多的命名来解决这个问题。)
当我们抛出一堆mod_rewrite时,不妨使用它来设置MIMEtypes:
RewriteRule \.php - [T=text/html]
要么
RewriteCond %{REQUEST_FILENAME} \.jpg$ RewriteRule ^ - [T=image/jpeg]
或类似的东西。 (请注意,如果专辑或照片名称包含“.php”等,第一个将会中断)
让我们知道结果如何!