2016-12-17 16 views
9

मैं किसी अन्य सर्वर में एक संपर्क फ़ॉर्म को संभालने के लिए एक सरल php बैकएंड बनाने के लिए कोशिश कर रहा हूँ, लेकिन उचित हेडर जोड़ने के बावजूद, यह मेरे दे रही है वही त्रुटि संदेश रखता है:XMLHttpRequest संसाधन लोड नहीं कर सकता

XMLHttpRequest cannot load https://php-contact-form-lual.herokuapp.com/. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:4000' is therefore not allowed access. The response had HTTP status code 404. 


यह ajax अनुरोध है:

$.ajax({ 
    type: 'POST', 
    url: 'https://php-contact-form-lual.herokuapp.com/', 
    data: { 
      subject: 'subject', 
      to: 'receiver', 
      name: $('#name').val(), 
      email: $('#email').val(), 
      msg: $('#msg').val() 
      } 
    }) // then the callbacks 


और इस php है:

<?php 

    if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') { 
    // return only the headers and not the content 
    // only allow CORS if we're doing a POST - i.e. no saving for now. 
    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']) && $_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD'] == 'POST') { 
    header('Access-Control-Allow-Origin: *'); 
    header('Access-Control-Allow-Headers: X-Requested-With'); 
    } 
    exit; 
} 

// handling the data  
$subject = $_POST['subject']; 
$to  = $_POST['to']; 
$name = $_POST['name']; 
$email = $_POST['email']; 
$msg  = $_POST['msg']; 
$msg  = "DE: " . $name . " (" . $email .")" . "\n\n" . $msg; 

mail($to, $subject, $msg); 

?> 

ध्यान दें कि "डेटा को संभालने" से पहले कोड की रेखाएं this answer से ली गई हैं, मैंने उसी उत्तर के पहले भाग में प्रस्तुत सरल समाधान के साथ भी प्रयास किया- कहीं और भी-- और यहां तक ​​कि तारांकन को बदलना सटीक URL, लेकिन परिणाम एक ही :(

किसी भी मदद की सराहना की जाएगी किया गया है :)


अद्यतन: बातें मैं (सबसे पुरानी से करने के लिए सर्वर साइड पर की कोशिश की है की लॉग वर्तमान):

// Allow from any origin 
if (isset($_SERVER['HTTP_ORIGIN'])) { 
    header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}"); 
    header('Access-Control-Allow-Credentials: true'); 
    header('Access-Control-Max-Age: 86400'); // cache for 1 day 
} 

// Access-Control headers are received during OPTIONS requests 
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') { 

    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD'])) 
     header("Access-Control-Allow-Methods: GET, POST, OPTIONS");   

    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS'])) 
     header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}"); 

    exit(0); 
} 

------------------------------------------ 

header("Access-Control-Allow-Origin: *"); 
header("Access-Control-Allow-Methods: POST, OPTIONS"); 

----------------------------------------- 

header("Access-Control-Allow-Origin: http://localhost:4000"); 
header("Access-Control-Allow-Methods: POST, OPTIONS"); 

----------------------------------------- 

header("Access-Control-Allow-Origin: http://localhost:4000"); 
header("Access-Control-Allow-Methods: POST, OPTIONS, GET"); 

----------------------------------------- 

if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') { 
    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']) && $_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD'] == 'POST') { 
     header('Access-Control-Allow-Origin: *'); 
     header('Access-Control-Allow-Headers: X-Requested-With, content-type, access-control-allow-origin, access-control-allow-methods, access-control-allow-headers'); 
    } 
    exit; 
} 

------------------------------------------ 

if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') { 
    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']) && $_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD'] == 'POST') { 
     header('Access-Control-Allow-Origin: *'); 
     header('Access-Control-Allow-Headers: X-Requested-With, content-type, access-control-allow-origin, access-control-allow-methods, access-control-allow-headers'); 
    } 
    exit; 
} 

// + sending headers though ajax 

------------------------------------------ 

header('Access-Control-Allow-Origin: *'); 
header('Access-Control-Allow-Headers: X-Requested-With, content-type, access-control-allow-origin, access-control-allow-methods, access-control-allow-headers'); 

------------------------------------------- 

# created .htaccess file with this line: 
Header set Access-Control-Allow-Origin "*" 

------------------------------------------ 

header('Access-Control-Allow-Origin: *'); 
header('Access-Control-Allow-Methods: POST, OPTIONS, GET'); 
header('Access-Control-Allow-Headers: X-Requested-With, content-type, access-control-allow-origin, access-control-allow-methods, access-control-allow-headers'); 

--------------------------------------------- 

header('Access-Control-Allow-Origin: http://localhost:4000'); 
header('Access-Control-Allow-Methods: POST, OPTIONS, GET'); 
header('Access-Control-Allow-Headers: X-Requested-With, content-type, access-control-allow-origin, access-control-allow-methods, access-control-allow-headers'); 

----------------------------------------------- 

if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') { 
    // return only the headers and not the content 
    // only allow CORS if we're doing a POST - i.e. no saving for now. 
    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']) && $_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD'] == 'POST') { 
    header('Access-Control-Allow-Origin: *'); 
    header('Access-Control-Allow-Headers: X-Requested-With'); 
    } 
    exit; 
} 

-------------------------------------------------- 

header('Origin: http://localhost:4000'); 
header('Access-Control-Allow-Origin: *'); 
header('Access-Control-Allow-Methods: POST, GET, OPTIONS'); 


Aditional जानकारी

अनुरोध हेडर

POST/HTTP/1.1 
Host: php-contact-form-lual.herokuapp.com 
Connection: keep-alive 
Content-Length: 88 
Accept: */* 
Origin: http://localhost:4000 
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36 
Content-Type: application/x-www-form-urlencoded; charset=UTF-8 
Referer: http://localhost:4000/contacto/ 
Accept-Encoding: gzip, deflate, br 
Accept-Language: es,en-GB;q=0.8,en;q=0.6,de;q=0.4 

प्रतिक्रिया हेडर

HTTP/1.1 404 Not Found 
Connection: keep-alive 
Date: Sat, 17 Dec 2016 16:10:02 GMT 
Server: Apache 
Content-Length: 198 
Content-Type: text/html; charset=iso-8859-1 
Via: 1.1 vegur 
+0

यह एक डुप्लिकेट क्वेरी है। यहां से सहायता लेने का प्रयास करें http://stackoverflow.com/questions/20035101/no-access-control-allow-origin-header-is-present-on-the-requested-resource – Nadeem

+0

धन्यवाद @Nadeem, लेकिन मैं पहले से ही पार हो गया वह प्रश्न और PHP उत्तर काम नहीं करता है और अधिकांश अन्य उत्तर सीधे समस्या का समाधान नहीं करते हैं, लेकिन तीसरे पक्ष के समाधान या बैकएंड के साथ समाधान php पर आधारित नहीं हैं। मैं वास्तव में बौद्धिक हित के लिए इसे PHP के लिए हल करना चाहता हूं, हालांकि मैं दृढ़ता से अन्य भाषा में बैकएंड को फिर से लिखने पर विचार कर रहा हूं। – Lual

+0

अजीब बात यह है कि प्रतिक्रिया शीर्षलेख आपके एक्सेस हेडर का बिल्कुल उल्लेख नहीं करते हैं। क्या हेरोकू हेडर फ़िल्टर करता है जिसे आप वापस कर सकते हैं? – Chris

उत्तर

9

मुझे लगता है कि सर्वर एक 404 त्रुटि लौटा रहा है। इससे पता चलता है कि आप की जरूरत नहीं है https://php-contact-form-lual.herokuapp.com/index.php तहत index.php फाइल के अंदर ऊपर पीएचपी कोड।

इसके अलावा, कि क्या आप वास्तव में https की जरूरत पर विचार करें। सर्वर भी एकल http अनुरोधों को स्वीकार करता है, और यदि हां, तो क्यों आप एसएसएल के बिना इसका इस्तेमाल करने की कोशिश क्यों नहीं करते?

अंत में, आप jQuery $.ajaxdataType: "jsonp" और JSON.stringify({})$.ajax data के लिए एक वस्तु का उपयोग कर JSON डेटा के रूप में डेटा पारित करने के लिए कोशिश की थी?

1

मैं एक बहुत ही साधारण परीक्षण मामले रख दिया है (कुछ स्थानीय सर्वर संभालने, या मैक, आदि)

फ़ाइल 1: site1/index.php

<script src="https://code.jquery.com/jquery-3.1.1.min.js" integrity="sha256-hVVnYaiADRTO2PzUGmuLJr8BLUSjGIZsDYGmIJLv2b8=" crossorigin="anonymous"></script> 
<script> 
$ 
    .ajax({ 
     type: 'POST', 
     url: 'http://127.0.0.1:7772', 
     data: { 
      subject: 'foo bar 123', 
     } 
    }) 
    .done(function(data) { 
     alert(data); 
    }); 
</script> 
Site 1 - sending data 

फ़ाइल 2: site2/index.php

<?php 

header('Access-Control-Allow-Origin: *'); 

echo "You posted " . $_POST['subject']; 

बूट दोनों को स्थानीय "सर्वर" अप, यदि आप एक पर हैं मैक, आप की तरह कुछ कर सकते हैं:

cd ./site1/ 
php -S 127.0.0.1:7771 

cd ../site2/ 
php -S 127.0.0.1:7772 

अब 127.0.0.1:7771 के पास जाकर आप एक छोटे से चेतावनी देखना चाहिए साइट 2 की सामग्री दिखा रहा है।

अब साइट 2 में header लाइन बाहर टिप्पणी:

// header('Access-Control-Allow-Origin: *'); 

और 127.0.0.1:7771 ताज़ा करें और आप एक वर्ग में वापस की त्रुटि के साथ किया जाना चाहिए: No 'Access-Control-Allow-Origin' header is present on the requested resource

"वर्किंग" प्रतिक्रिया/अनुरोध हेडर :

enter image description here

"काम नहीं" प्रतिक्रिया/अनुरोध हेडर:

enter image description here

मैं है कि आप एक उत्पादन साइट में header('Access-Control-Allow-Origin: *'); नहीं जोड़ना चाहिए बल देते हैं। लेकिन आपको इस मुद्दे को कम करने की आवश्यकता है, और यह पर्याप्त होना चाहिए कि त्रुटि/गलत कॉन्फ़िगरेशन

+0

डाउनवोट? मैंने ओपी को अपने सभी सवालों के जवाब देने में सक्षम होने के सभी औजार दिए हैं - जो उन्होंने प्रदान की गई जानकारी दी है, वह सबसे ज्यादा कर सकता है। – Chris

+0

हैलो @ क्रिस, आपके उत्तर के लिए धन्यवाद, मैं आपसे सहमत हूं कि इससे मेरी गलती स्पष्ट हो सकती है, क्योंकि स्थानीय परीक्षण ने मुझे ब्राउज़र द्वारा दिए गए त्रुटि संदेश के पहले भाग से अलग विकल्पों के बारे में सोचा होगा। – Lual

+0

पीएस: मैंने आपके जवाब को स्तर की चीजों से ऊपर उठाया (वाई) – Lual

4

समस्या 404 स्थिति कोड है। यह आपके द्वारा टाइप किए जा रहे कोड तक भी नहीं पहुंच रहा है।

  1. आप एक

    $app->post('/', function() use($app) { 
        // This is the route you need to edit. 
    }); 
    
  2. है आप किसी भी "जब" या अन्य मार्ग के लिए शर्त है? यदि ऐसा है, तो इसे अभी हटा दें।

  3. आपके पास https के लिए कॉन्फ़िगरेशन विशिष्ट होना चाहिए? मैं यह भी ध्यान देता हूं कि आपके पास http (403) बनाम https (404) पर अलग-अलग सेटिंग्स हैं, डिफ़ॉल्ट रूप से हेरोोको http और https दोनों के लिए एक ही कोड प्रदान करता है जब तक कि आप सिलेक्स के लिए कॉन्फ़िगर नहीं करते हैं।

  4. एक बार जब आप यह काम कर रहे हों (यानी 404 नहीं), तो आपको प्रतिक्रिया के रूप में एक ही समय में Access-Control-Allow-Origin शीर्षलेख वापस करना होगा (जैसा कि आपने "मैंने जो कोशिश की है" उदाहरणों में से एक है। 'प्रस्थान' उसके बाद वास्तव में सामग्री पाएगा लौटाए जाने जो पूरी तरह उपयोगी नहीं है (आप रीडायरेक्ट/स्थान हेडर के बाद 'प्रस्थान' की जरूरत है, लेकिन यहाँ नहीं)


अन्य नोट:।।

  • यदि आप "सरल" PHP बैकएंड बनाने की कोशिश कर रहे हैं, तो हेरोोकू क्यों जाएं? आप वास्तव में PHP को कोडिंग नहीं कर रहे हैं, लेकिन सिम्फनी, सिलेक्स, ट्विग और अन्य सभी पुस्तकालयों को कोडिंग करते हैं जिसका अर्थ है कि आप दस्तावेज़ीकरण और लाइब्रेरी ओवरकिल में हैं।
  • आप Heroku का उपयोग कर रहे हैं, वहाँ एक SwiftMailer इंटरफ़ेस है (आप मदद करेंगे mail() सुरक्षित!
+0

आपकी टिप्पणियों के लिए धन्यवाद, मैंने इसकी विश्वसनीयता के कारण हेरोोक चुना है। आपका पहला वाक्य वास्तव में मुझे सही परिप्रेक्ष्य देता है, मैंने त्रुटि संदेश के 404 भाग को नजरअंदाज कर दिया था क्योंकि मैंने माना (गलत तरीके से) कि ब्राउज़र ने मुझे हेडर की वजह से 404 दिया - और यह चारों ओर एक और तरीका बन गया:/। मैंने पहले ही आपका जवाब उखाड़ फेंका है और यदि @ क्रिस्टोस लिट्रास अपनी टिप्पणी को उत्तर के रूप में प्रकाशित नहीं करता है, तो मैं आपकी स्वीकार करूंगा (उनकी टिप्पणी ने मुझे 404 पर भी इंगित किया और आपके उत्तर से पहले प्रकाशित किया गया था)। दोबारा, बहुत बहुत धन्यवाद – Lual

+0

खुशी है कि आपने इसे हल किया! और टिकने/टिकने के बारे में चिंतित न हों - धन्यवाद-टिप्पणियां अधिक सराहना की जाती हैं क्योंकि मुझे पता है कि इससे मदद मिली है। – Robbie

0

क्या कोई htaccess फ़ाइल है?

हां?

तो क्या आप परीक्षण के लिए इसे आजमा सकते हैं?

<IfModule mod_headers.c> 
SetEnvIfNoCase ORIGIN (.*) ORIGIN=$1 
Header always set Access-Control-Allow-Methods "POST, GET, PUT, OPTIONS, PATCH, DELETE" 
Header always set Access-Control-Allow-Origin "%{ORIGIN}e" 
Header always set Access-Control-Allow-Credentials "true" 
Header always set Access-Control-Allow-Headers "X-Accept-Charset,X-Accept,Content-Type" 
Header always set P3P "policyref='/w3c/p3p.xml', CP='NOI DSP COR NID CUR ADM DEV OUR BUS'" 
RewriteEngine On 
RewriteCond %{REQUEST_METHOD} OPTIONS 
RewriteRule ^(.*)$ $1 [R=200,L,E=HTTP_ORIGIN:%{HTTP:ORIGIN}]  
</IfModule> 

नहीं?

आप इस htaccess को php हेडर टैग में परिवर्तित कर सकते हैं। नमूना रूपांतरण यहां How to convert my htaccess code to php header

संबंधित मुद्दे