সাধারণ HTTP সার্ভারে অ্যাক্সেস নিয়ন্ত্রণ সক্ষম করুন


121

খুব সাধারণ এইচটিটিপি সার্ভারের জন্য আমার কাছে নিম্নলিখিত শেল স্ক্রিপ্ট রয়েছে:

#!/bin/sh

echo "Serving at http://localhost:3000"
python -m SimpleHTTPServer 3000

আমি ভাবছিলাম কীভাবে আমি এই সার্ভারটির মতো একটি সিওআরএস শিরোনাম সক্ষম করতে বা যুক্ত করতে পারি Access-Control-Allow-Origin: *?

উত্তর:


197

দুর্ভাগ্যক্রমে, সহজ এইচটিটিপি সার্ভারটি আসলেই সহজ যে এটি কোনও স্বনির্ধারণের অনুমতি দেয় না, বিশেষত এটি পাঠানো শিরোনামগুলির জন্য নয়। তবে বেশিরভাগটি ব্যবহার করে আপনি নিজেই একটি সাধারণ এইচটিটিপি সার্ভার তৈরি করতে পারেন SimpleHTTPRequestHandlerএবং কেবলমাত্র সেই পছন্দসই শিরোনামটি যুক্ত করতে পারেন।

তার জন্য, কেবল একটি ফাইল তৈরি করুন simple-cors-http-server.py(বা যাই হোক না কেন) এবং আপনি যে পাইথন সংস্করণটি ব্যবহার করছেন তার উপর নির্ভর করে নীচের কোডগুলির মধ্যে একটি রাখুন।

তারপরে আপনি এটি করতে পারেন python simple-cors-http-server.pyএবং এটি আপনার পরিবর্তিত সার্ভার চালু করবে যা প্রতিটি প্রতিক্রিয়ার জন্য সিওআরএস শিরোনাম সেট করবে will

শীর্ষে শেবাং দিয়ে , ফাইলটিকে এক্সিকিউটেবল করে তুলুন এবং এটি আপনার রাস্তায় রাখুন এবং আপনি এটি ব্যবহার করে simple-cors-http-server.pyখুব সহজেই চালাতে পারেন ।

পাইথন 3 সমাধান

পাইথন 3 ব্যবহারসমূহ SimpleHTTPRequestHandlerএবং HTTPServerথেকে http.serverমডিউল সার্ভার চালানোর জন্য:

#!/usr/bin/env python3
from http.server import HTTPServer, SimpleHTTPRequestHandler, test
import sys

class CORSRequestHandler (SimpleHTTPRequestHandler):
    def end_headers (self):
        self.send_header('Access-Control-Allow-Origin', '*')
        SimpleHTTPRequestHandler.end_headers(self)

if __name__ == '__main__':
    test(CORSRequestHandler, HTTPServer, port=int(sys.argv[1]) if len(sys.argv) > 1 else 8000)

পাইথন 2 সমাধান

পাইথন 2 ব্যবহার করে SimpleHTTPServer.SimpleHTTPRequestHandlerএবং সার্ভারটি চালানোর জন্য BaseHTTPServerমডিউল

#!/usr/bin/env python2
from SimpleHTTPServer import SimpleHTTPRequestHandler
import BaseHTTPServer

class CORSRequestHandler (SimpleHTTPRequestHandler):
    def end_headers (self):
        self.send_header('Access-Control-Allow-Origin', '*')
        SimpleHTTPRequestHandler.end_headers(self)

if __name__ == '__main__':
    BaseHTTPServer.test(CORSRequestHandler, BaseHTTPServer.HTTPServer)

পাইথন 2 এবং 3 সমাধান

পাইথন 3 এবং পাইথন 2 উভয়ের জন্য আপনার যদি সামঞ্জস্যতা প্রয়োজন হয় তবে আপনি এই বহুভোজী স্ক্রিপ্টটি উভয় সংস্করণে কাজ করতে পারেন। এটি প্রথমে পাইথন 3 অবস্থান থেকে আমদানি করার চেষ্টা করে এবং অন্যথায় পাইথন 2 এ ফিরে যায়:

#!/usr/bin/env python
try:
    # Python 3
    from http.server import HTTPServer, SimpleHTTPRequestHandler, test as test_orig
    import sys
    def test (*args):
        test_orig(*args, port=int(sys.argv[1]) if len(sys.argv) > 1 else 8000)
except ImportError: # Python 2
    from BaseHTTPServer import HTTPServer, test
    from SimpleHTTPServer import SimpleHTTPRequestHandler

class CORSRequestHandler (SimpleHTTPRequestHandler):
    def end_headers (self):
        self.send_header('Access-Control-Allow-Origin', '*')
        SimpleHTTPRequestHandler.end_headers(self)

if __name__ == '__main__':
    test(CORSRequestHandler, HTTPServer)

আমি নির্দেশাবলী অনুসরণ করেছিলাম তবে পাইথন সিম্পল-কর্স- htp-server.py চালিয়ে আমি ত্রুটি পাই: পাইথন: 'সরল- কর্স- htp-server.py' ফাইলটি খুলতে পারে না: [এররনো 2] এই জাতীয় কোনও ফাইল বা ডিরেক্টরি লগআউট নেই ....কোন চিন্তা?
এমচান

4
@ পোক সার্ভারটি 501 অসমর্থিত পদ্ধতিতে ('বিকল্পগুলি') সাড়া দেয়। আমি পাইথন 2.7.6 দিয়ে ওএস এক্স 10.10.1 চালাচ্ছি .1 কোনও পরামর্শ? HTTP/1.0 501 Unsupported method ('OPTIONS') Server: SimpleHTTP/0.6 Python/2.7.6 Date: Wed, 21 Jan 2015 23:16:10 GMT Content-Type: text/html Connection: close Access-Control-Allow-Origin: *
হেয়ারআফডডগ

1
পছন্দ করুন আপনি চাইলে এটি যুক্ত করতে পারেন (HTTP সার্ভারগুলি সম্পর্কে পাইথন ম্যানুয়ালটি পড়ুন); অথবা আপনি ঠিক সেভাবে সার্ভারটি অ্যাক্সেস করার চেষ্টা করতে পারেন নি।
অকর্মা

2
@ রবার্তোফ্রান্সচিনি আপনি সম্ভবত প্রাক-আলোকিত অনুরোধগুলি চালাচ্ছেন যা OPTIONSপদ্ধতিটি সঠিকভাবে প্রয়োগ করা প্রয়োজন। সাধারণ অনুরোধগুলির জন্য, কেবল Access-Control-Allow-Originশিরোনাম প্রেরণের সমাধানটি এখনও ঠিক কাজ করা উচিত।
poke

1
@ টিগুই 7 এটি সাধারণ HTTP সার্ভারের সাথে সাধারণ আচরণ হতে পারে। এর আগে পারফরম্যান্স সম্পর্কিত আমার বিভিন্ন ফলাফল ছিল। তবে কেবল এক মুহুর্তের জন্য সার্ভার চালানোর জন্য, আমি এখনও এটিকে দ্রুত সমাধান হিসাবে বিবেচনা করি।
অকর্মা

108

HTTP- সার্ভারের মতো বিকল্প চেষ্টা করুন

যেহেতু সিম্পলএইচটিটিপিএস সার্ভারটি আপনি প্রযোজনার ক্ষেত্রে যে ধরনের সার্ভার স্থাপন করেন তা নয়, তাই আমি এখানে ধরেই নিচ্ছি যে আপনি কোন সরঞ্জামটি যতক্ষণ ব্যবহার করবেন ততক্ষণ আপনি তার যত্ন নেবেন না যতক্ষণ না এটি সরলভাবে সিওআরএস http://localhost:3000শিরোনামের সাথে আপনার ফাইলগুলি প্রকাশের কাজ করে? কমান্ড লাইন

# install (it requires nodejs/npm)
npm install http-server -g

#run
http-server -p 3000 --cors

এইচটিটিপিএস দরকার?

আপনার যদি স্থানীয় https প্রয়োজন হয় তবে আপনি ক্যাডি বা সার্টবোটও চেষ্টা করতে পারেন


সম্পর্কিত কিছু সরঞ্জাম আপনি দরকারী মনে হতে পারে

  • এনগ্রোক : চলমান অবস্থায় ngrok http 3000এটি একটি ইউআরএল তৈরি করে যা https://$random.ngrok.comকাউকে আপনার http://localhost:3000সার্ভার অ্যাক্সেস করার অনুমতি দেয় । এটি আপনার কম্পিউটারে স্থানীয়ভাবে যা চালায় তা বিশ্বের কাছে প্রকাশ করতে পারে (স্থানীয় ব্যাকেন্ডস / এপিআই সহ)

  • লোকালটোনেল : এনগ্রোকের মতো প্রায়

  • এখন : চলমান অবস্থায় now, এটি অনলাইনে আপনার স্থিতিশীল সম্পদগুলি আপলোড করে এবং এতে স্থাপন করে https://$random.now.sh। আপনি অন্যথায় সিদ্ধান্ত না নিলে এগুলি চিরকাল অনলাইনে থাকে। বিভাজন দ্রুত (প্রথমটি বাদে) পৃথক হওয়ার জন্য ধন্যবাদ। এখন প্রোডাক্ট ফ্রন্টএন্ড / এসপিএ কোড মোতায়েনের জন্য উপযুক্ত এটি ডকার এবং নোডজেএস অ্যাপ্লিকেশনও মোতায়েন করতে পারে। এটি আসলে নিখরচায় নয়, তবে তাদের একটি নিখরচায় পরিকল্পনা রয়েছে।


5
আমি একজন সাধারণ মানুষ আমি এমন একটি সমাধান দেখছি যার জন্য npmএমন কোনও মেশিনে ইনস্টল করা প্রয়োজন যা কেবলমাত্র পরিচিত python, আমি ডাউনওয়েট।
পার্থিয়ান শট

6
@ পার্থিয়ানশট: আপনি এই কাজের জন্য সেরা সরঞ্জামটি ব্যবহার করতে শিখতে চাইতে পারেন।
ড্যান ড্যাসকলেসকু

2
@ পার্থিয়ানশট অনেক বিকাশকারী ইতিমধ্যে নোড / এনপিএম ইনস্টল করেছেন and এবং প্রশ্ন শিরোনাম ব্যবহারকারীদের বিশাল সংখ্যক দর্শকদের চালিত করতে যথেষ্ট জেনারিক যা স্পষ্টভাবে পাইথন বা সিম্পলএইচটিটিপিএস সার্ভারের বিষয়ে চিন্তা করে না, যা আপভোটগুলি দ্বারা নিশ্চিত করা হয়েছে। এটি কারণ এটি আপনার পক্ষে সহায়ক নয় যে এটি সবার জন্য। নোড এবং পাইথন উভয়ই পছন্দ না করার যথেষ্ট কারণ রয়েছে। বামপ্যাড / খারাপ প্রকাশ / খারাপ গিট ব্যবহারের মতো জিনিসগুলি আমার কাছে সম্পূর্ণ সম্পর্কিত নয় বলে মনে হয়।
সেবাস্তিয়ান লোরবার

5
একটি অতিরিক্ত ভাষা এবং কাঠামো যুক্ত করা প্রযুক্তিগত debtণকে অন্তর্ভুক্ত করে এবং পরিবেশের আক্রমণ পৃষ্ঠকে বাড়িয়ে তোলে । "যে কোনও প্রোগ্রামিং ভাষায় মারাত্মক ভুল করা যেতে পারে" সত্য, তবে জেএস অন্যান্য ভাষাগুলির চেয়ে সহজ করে তোলে। এবং প্রত্যেকটি ভাষাতে গ্যাচস রয়েছে; আপনি যত কম ভাষা ব্যবহার করেন, তত কম সম্ভাবনা থাকে যে কোনও বিকাশকারী যে কোনও একটি ভাষার সাথে অপরিচিত তা ভুল করেন যা অন্য কোনও ভাষায় ভুল হবে না।
পার্থিয়ান শট

2
এটি প্রতিবার যখন আপনার বাড়ির চারপাশে সহায়তার প্রয়োজন তখন কোনও শিশুকে দত্তক নেওয়ার মতো; এটি রাস্তা নিরসনের চেয়ে আরও বেশি সমস্যা তৈরি করে।
পার্থিয়ান শট

1

আমি একই সমস্যা ছিল এবং এই সমাধানে এসেছি:

class Handler(SimpleHTTPRequestHandler):
    def send_response(self, *args, **kwargs):
        SimpleHTTPRequestHandler.send_response(self, *args, **kwargs)
        self.send_header('Access-Control-Allow-Origin', '*')

সিম্পিচটিটিপিআরকিউস্টেস্টহ্যান্ডলার থেকে উত্তরাধিকার সূত্রে আমি একটি নতুন শ্রেণি তৈরি করেছি যা কেবল send_responseপদ্ধতিটি পরিবর্তন করে ।


0

আপনাকে do_GET () (এবং do_HEAD () যদি হেড অপারেশনগুলিকে সমর্থন করতে চান তবে) এর নিজস্ব দৃষ্টান্ত সরবরাহ করতে হবে। এটার মতো কিছু:

class MyHTTPServer(SimpleHTTPServer):

    allowed_hosts = (('127.0.0.1', 80),)

    def do_GET(self):
        if self.client_address not in allowed_hosts:
            self.send_response(401, 'request not allowed')
        else:
            super(MyHTTPServer, self).do_Get()

আপনার উত্তরের জন্য ধন্যবাদ, তবে আমার কাছে পাইথনের কোন জ্ঞান নেই যা আমি এখনও জানি না, আমি আমার এমবারজস অ্যাপ্লিকেশনগুলির জন্য একটি সাধারণ HTTP সার্ভার হিসাবে উপরে উল্লিখিত শেল স্ক্রিপ্টটি ব্যবহার করছি। অ্যাক্সেস নিয়ন্ত্রণ সমস্যার সাথে সংঘর্ষের সময় কেবলই আমি অনুসন্ধান করেছিলাম যে এই সাধারণ HTTP সার্ভারে এটি সক্ষম করার দরকার আছে। সুতরাং কিছু গবেষণার পরে আমি যুক্ত করেছি ('ক্রসআরগিন' সক্ষম করুন, উত্স => '*';) তবে আশ্চর্যজনকভাবে এটি কার্যকর হয়নি। আপনি যদি দয়া করে আমাকে কোনও পাইথন সরল HTTP সার্ভার শেল স্ক্রিপ্টের দিকে নির্দেশ করতে পারেন যার মধ্যে অ্যাক্সেস নিয়ন্ত্রণ বৈশিষ্ট্য রয়েছে যা অত্যন্ত প্রশংসিত হবে
এমচান

একটি সামান্য নোটে, আমি এখানে সত্যিই অলস হওয়ার চেষ্টা করছি না তবে পাইথন শিখতে শুরু করব কেবল এই বৈশিষ্ট্যটিকে সরল এইচটিটিপি সার্ভারে যুক্ত করার জন্য এই মুহুর্তে যৌক্তিক মনে হচ্ছে না তাই আমি আশা করি এটি যুক্ত করা সহজ হবে বা আশা করি আমি খুঁজে পেতে পারি একটি বিকল্প / প্রস্তুত তৈরি পাইথন স্ক্রিপ্ট যা কাজটি করতে পারে যাতে আমি আমার দেবের কাজ চালিয়ে যেতে পারি
এমচান

3
সিম্পলএইচটিটিপিএস সার্ভারের অ্যাক্সেস নিয়ন্ত্রণগুলিকে সমর্থন করার কোনও বিকল্প নেই। হয় আপনাকে নিজের কোডটি রোল করতে হবে - অথবা অ্যাক্সেস নিয়ন্ত্রণগুলিকে সমর্থন করে এমন অন্য ওয়েব সার্ভারে স্যুইচ করতে হবে। ভাবুন lighttpd.net
user590028
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.