2017-09-04 214 views
0

我從服務器下載時遇到麻煩。如果我輸入到http://mypage.com不能下載一些.zip文件。但是如果我輸入到該頁面的IP,我下載了這些文件。無法下載文件

我遇到的其他類似問題是與Godaddy,即使我使用IP或域訪問,也無法使我的zip下載。

這是代碼生成XML的一部分,它ZIP:

**xmlzip.php** 
    $xmlfile = $rfc.$year.$month.'BN.xml'; 
    $xml->formatOutput = true; 
    $el_xml = $xml->saveXML(); 
    $xml->save($xmlfile); 

    $filename = $rfc.$year.$month.'BN'; 
    shell_exec('zip ../'.$filename.' '.$xmlfile); 

    try { 
     $date= date('Ymd_Hi'); 
     $data = '{ 
      "filename":"xml'.$date.'.zip", 
      "filename2":"'.$filename.'.zip" 
     }'; 
     echo '{"success":1,"message":"ok","data":['.$data.']}'; 
    } catch (Exception $e) { 
     $data = ''; 
     echo '{"error":1,"message":"error","data":['.$data.']}'; 
     die(); 
    } 

然後我得到這個在ExtJS的創建Messagebox.wait:

**downloadzip button** 
    msg = Ext.MessageBox.wait('Generating XML ...', ''); 
     Ext.Ajax.request({ 
      url: 'cakephp/app/webroot/xml.php?', 
      params:{ 
       rfc: rfc, 
       month: month, 
       year: year 
      }, 
      method : "POST", 
      headers: { 
       'Content-Type': 'application/json' 
      }, 
      jsonData: true, 
      timeout: 1000000, 
      withCredentials: true, 
      success : function(response) { 
       var jsonResponse = JSON.parse(response.responseText); 
       filename = jsonResponse.data[0].filename; 
       filename2 = jsonResponse.data[0].filename2; 

       if(jsonResponse.success === 1) { 
        msg.hide(); 
        Ext.getCmp("winFormXML_XMLpanel").setHtml(
         '<iframe id="" name=""'+ 
         ' src="cakephp/app/webroot/download_xml.php?filename='+ 
         filename+'&filename2='+filename2+'" width="100%" height="100%"></iframe>'); 
        Ext.getCmp('winFormXML').destroy(); 
       } else { 
        msg.hide(); 
        Ext.Msg.alert("ERROR","Error generating XML."); 
       } 

      }, 
      failure : function(response) { 
       msg.hide(); 
       var respObj = Ext.JSON.decode(response.responseText); 
       console.log(respObj); 
       Ext.Msg.alert("ERROR", respObj.status.statusMessage); 
      } 
     }); 

而與此我下載生成的文件:

**downloadzip.php** 
    try { 
     $filename = $_REQUEST['filename']; 
     $filename2 = $_REQUEST['filename2']; 

     header('Content-Type: application/zip'); 
     header('Content-disposition: attachment; filename='.$filename2); 
     header('Content-Length: ' . filesize($filename2)); 
     readfile($filename2); 
    } catch(Exception $ex) { 
     echo $ex-getMessage(); 
    } 

正如我前面提到的,我知道它的作品,因爲我可以FR下載其他計算機,但通過IP,而不是來自域。


編輯:

看來,線Ext.getCmp('winFormXML').destroy();生成時被給予的煩惱。刪除該行使它的工作!

+1

希望我沒有錯,但一般來說,如果您在使用IP地址時解決了URL問題,可能是[DNS](https:// en。 wikipedia.org/wiki/Domain_Name_System#Function)或[hosts文件](https://en.wikipedia.org/wiki/Hosts_(file)#Purpose)。嘗試打開命令提示符pt命令並ping URL mypage.com,如果在命令結果/輸出中沒有看到正確的IP地址,請嘗試檢查您的DNS或主機文件。另一件事,不要在你的cakephp webroot文件夾中啓動php腳本,這是一個安全問題/違規。 – Benfarhat

+0

upvote cuz你是答案。謝謝!首先,ping到mypage.com及其正確的IP。我檢測到的其他問題是,當我點擊downloadxml按鈕時,我的downloadzip.php以兩種方式都會變紅(錯誤/警告),我的意思是當下載在網絡選項卡中工作時.Request標題顯示:'Upgrade-Insecure -REQUESTS:1'。沒有預覽或迴應。在計時被暫停在21.00毫秒。有任何想法嗎? :(。順便說一句,最好的路徑把PHP腳本? –

回答

1

Upgrade-Insecure-Requests:1」表示您的瀏覽器要求您的服務器將url(http)轉換爲安全url(https)。 (或者插件exist)或者只是使用一個控制器(如pagesController或專用的控制器),並在控制器內部創建一個動作(函數),它將完成所有的操作你需要的工作(對XML文件,zip和下載的行動)

像這樣你可以添加一個安全層(例如只讓認證用戶下載你的文件),你也可以添加一些統計數據(保存下載計數器在你的數據庫)

而且我不確定使用shell_exec是一種好的做法,而不是這個,請嘗試ziparchive 一個有用的cakephp zip helper 例子或類似這樣的

<?php 

... 

$filename2 = 'xml.zip'; 

$zip = new ZipArchive; 

if ($zip->open($filename2, ZipArchive::CREATE)!==TRUE) 
{ 
    die("zip creation failed!"); 
} else { 
    $zip->addFile($xmlfile); 
    $zip->close(); 

    header('Content-Type: application/zip'); 
    header('Content-disposition: attachment; filename='.$filename2); 
    header('Content-Length: ' . filesize($filename2)); 
    readfile($filename2); 
    unlink($filename2); 
} 
?> 

,最後你的問題,如果您在使用IP地址沒有升級不安全,請求消息,它意味着問題來自您的瀏覽器。嘗試使用不實現此安全級別的瀏覽器(如chrome或firefox),或者只是將您的網站配置爲使用https協議: - >在您的網站中重定向。htaccess的(你的CakePHP的根目錄內)

<IfModule mod_rewrite.c> 
    RewriteEngine on 

    RewriteCond %{REQUEST_URI} !^/(s|g)etcmd?(.+)$ 
    RewriteCond %{HTTPS} !=on 
    RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R=301,L] 

    RewriteCond %{QUERY_STRING} ^(.*)http(\:|\%3A)(.*)$ 
    ReWriteRule .* - [F]  

    RewriteRule ^$ webroot/ [L] 
    RewriteRule (.*) webroot/$1 [L] 
</IfModule> 

- >和你一些配置虛擬主機偵聽端口443(內部的/ etc/apache2的/站點可用,如果你下的* nix)

# with the automatic HTTPS redirection you are not supposed to configure HTTP part (port 80) 
<VirtualHost *:80> 
    ServerAdmin [email protected] 
    ServerName mypage.com 
    ServerAlias mypage.com 
    DocumentRoot /var/www/mypage 
    <Directory /var/www/mypage/> 
     Options -Indexes +FollowSymLinks +MultiViews 
     AllowOverride All 
     Order Allow,Deny 
     Allow from All 
    </Directory> 
    ServerSignature Off 
    ErrorLog /var/log/apache2/error.log 
</VirtualHost> 
<VirtualHost *:443> 
    ServerAdmin [email protected] 
    ServerName mypage.com 
    ServerAlias mypage.com 
    DocumentRoot /var/www/mypage 
    <Directory /var/www/mypage/> 
     Options -Indexes +FollowSymLinks +MultiViews 
     AllowOverride All 
     Order Allow,Deny 
     Allow from All 
    </Directory> 
    ServerSignature Off 

    SSLEngine on 
    SSLProtocol all -SSLv2 
    SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM 

    # If you have secure certificate 
    SSLCertificateFile /etc/apache2/certificats/YOURCRTFILE.crt 
    SSLCertificateKeyFile /etc/apache2/certificats/YOURPEMFILE.pem 
    SSLCertificateChainFile /etc/apache2/certificats/YOURPEMFILE.pem 
    SSLCACertificatePath /etc/ssl/certs/ 
    SSLCACertificateFile /etc/apache2/certificats/YOURCRTFILE.crt 
    ErrorLog /var/log/apache2/error.log 
</VirtualHost> 

希望它有幫助

+0

嘿!謝謝你是anwser!我是相對新的發展,並因爲時間,我用一個PHP而不是控制器(因爲我'在ZIP這一代中,我使用了ziparchive,但是嘗試使用shell_exec來解決我的問題,但現在我已經解決了這個問題,並且根據你的說法,我將把它替換爲shell_exec。還有最後一件事,你能幫我一個關於如何在cakephp/controller上創建xml和zip的例子嗎? –

+0

cakephp的哪個版本? – Benfarhat

+0

對不起,遲了!我在版本2.6.1 –