Câu hỏi Bật điều khiển truy cập trên máy chủ HTTP đơn giản


Tôi có kịch bản lệnh shell sau cho một máy chủ HTTP rất đơn giản:

#!/bin/sh

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

Tôi đã tự hỏi làm thế nào tôi có thể kích hoạt hoặc thêm một tiêu đề CORS như Access-Control-Allow-Origin: * đến máy chủ này?


76
2018-02-22 16:00


gốc




Các câu trả lời:


Không may, SimpleHTTPServer thực sự đơn giản là nó không cho phép bất kỳ tùy chỉnh nào, đặc biệt là không phải các tiêu đề mà nó gửi đi. Tuy nhiên, bạn có thể tự tạo một máy chủ HTTP đơn giản, sử dụng hầu hết SimpleHTTPServerRequestHandlervà chỉ cần thêm tiêu đề mong muốn đó.

Chỉ cần tạo một tệp simple-cors-http-server.py (hoặc bất cứ điều gì) và đặt bên trong như sau:

#!/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)

Sau đó, bạn có thể làm python simple-cors-http-server.py và nó sẽ khởi chạy máy chủ đã được sửa đổi của bạn, nó sẽ thiết lập tiêu đề CORS cho mọi đáp ứng.

Với shebang ở trên cùng, hãy thực thi tệp và đặt nó vào PATH của bạn, và bạn có thể chạy nó bằng cách sử dụng simple-cors-http-server.py quá.


Đối với một giải pháp hoạt động với Python 3, bạn có thể thay đổi đơn giản việc nhập khẩu ở trên để nhập từ http.server mô-đun (tất cả các loại đều có).

Ngoài ra, bạn có thể sử dụng tính năng này hoạt động trên cả Python 3 và Python 2. Kịch bản đầu tiên cố gắng nhập từ các vị trí Python 3 và trở về Python 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)

130
2018-02-22 16:28



Tôi làm theo hướng dẫn nhưng bằng cách thực hiện python simple-cors-http-server.py tôi nhận được lỗi: python: không thể mở tập tin 'simple-cors-http-server.py': [Errno 2] Không có tập tin hoặc thư mục đăng xuất .... bất kỳ suy nghĩ nào? - MChan
Sau đó, bạn không đặt tên tệp chính xác hoặc tệp đó không nằm trong thư mục hiện tại. Lỗi chỉ nói rằng Python cố gắng thực thi tệp, nhưng không thể tìm thấy tệp. - poke
@poke Máy chủ phản hồi với phương thức 501 không được hỗ trợ ('OPTIONS'). Tôi đang chạy OS X 10.10.1 với Python 2.7.6. Bất kỳ đề xuất? 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: * - HairOfTheDog
@HairOfTheDog SimpleHTTPRequestHandler không hỗ trợ phương thức OPTIONS HTTP. Bạn có thể thêm nó nếu bạn muốn (đọc hướng dẫn sử dụng Python về các máy chủ HTTP); hoặc bạn không thể truy cập vào máy chủ như thế. - poke
@RobertoFranceschini Bạn có thể gặp phải yêu cầu được hiển thị trước yêu cầu OPTIONS phương pháp được triển khai đúng cách. Đối với các yêu cầu đơn giản, giải pháp chỉ gửi Access-Control-Allow-Origin tiêu đề vẫn hoạt động tốt. - poke


Thử thay thế như máy chủ http

Vì SimpleHTTPServer không thực sự là loại máy chủ mà bạn triển khai để sản xuất, tôi giả định ở đây rằng bạn không quan tâm nhiều đến công cụ nào bạn sử dụng miễn là công việc hiển thị tệp của bạn tại http://localhost:3000 với tiêu đề CORS trong một dòng lệnh đơn giản

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

#run
http-server -p 3000 --cors

Một số công cụ liên quan bạn có thể thấy hữu ích

  • ngrok: khi chạy ngrok http 3000, nó tạo ra một url https://$random.ngrok.com cho phép mọi người truy cập http://localhost:3000 máy chủ. Nó có thể tiếp xúc với thế giới những gì chạy cục bộ trên máy tính của bạn (bao gồm cả các phụ trợ cục bộ / apis)

  • localtunnel: gần giống như ngrok

  • hiện nay: khi chạy now, nó tải lên tài sản tĩnh của bạn trực tuyến và triển khai chúng https://$random.now.sh. Họ vẫn trực tuyến mãi mãi trừ khi bạn quyết định khác. Triển khai nhanh (ngoại trừ cái đầu tiên) nhờ có sự khác biệt. Bây giờ là thích hợp cho việc triển khai sản xuất frontend / SPA code Nó cũng có thể triển khai các ứng dụng Docker và NodeJS. Nó không phải là thực sự miễn phí, nhưng họ có một kế hoạch miễn phí.


59
2018-02-20 15:43



vì một lý do nào đó nó không hoạt động. - アレックス
nó hoạt động tốt cho tất cả các nhóm của tôi. giải thích vấn đề của bạn - Sebastien Lorber
Giải pháp này là tốt hơn cho tôi nhiều hơn so với một python, trong đó có lag liên tục. - Tyguy7
Tôi là một người đàn ông đơn giản. Tôi thấy một giải pháp yêu cầu cài đặt npm trên một máy chỉ được biết là có python, Tôi downvote. - Parthian Shot


Bạn sẽ cần phải cung cấp các trường hợp riêng của do_GET () (và do_HEAD () nếu chọn để hỗ trợ các hoạt động HEAD). một cái gì đó như thế này:

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()

0
2018-02-22 16:10



Cảm ơn câu trả lời của bạn, nhưng tôi không có kiến ​​thức về Python cho đến giờ, tôi chỉ sử dụng kịch bản lệnh shell được đề cập ở trên như một máy chủ http đơn giản cho các ứng dụng Emberjs của tôi. Chỉ khi va chạm với vấn đề kiểm soát truy cập, tôi đã nghiên cứu để thấy rằng tôi cần phải kích hoạt nó trong máy chủ http đơn giản này. Vì vậy, sau khi một số nghiên cứu tôi thêm vào (cho phép 'CrossOrigin', nguồn gốc => '*';) nhưng không ngạc nhiên là nó không hoạt động. Nếu bạn có thể vui lòng chỉ cho tôi bất kỳ kịch bản lệnh máy chủ http đơn giản Python nào bao gồm tính năng kiểm soát truy cập sẽ được đánh giá cao - MChan
Trên một lưu ý nhỏ, tôi không cố gắng lười biếng ở đây thực sự nhưng bắt đầu học python chỉ để thêm tính năng này vào máy chủ simpleHTTP âm thanh không hợp lý vào thời điểm này vì vậy tôi đã hy vọng nó sẽ được dễ dàng để thêm HOẶC hy vọng tôi có thể tìm thấy một tập lệnh Python thay thế / sẵn sàng có thể thực hiện công việc để tôi có thể tiếp tục với công việc dev của mình - MChan
SimpleHTTPServer không có tùy chọn để hỗ trợ điều khiển truy cập. Hoặc bạn sẽ cần phải cuộn mã của riêng bạn - hoặc chuyển sang một máy chủ web khác hỗ trợ các điều khiển truy cập. Nghĩ về lighttpd.net - user590028