为什么SimpleHTTPServer重定向到?查询字符串/当我请求?查询字符串?(Why does

2019-08-01 14:22发布

我喜欢用Python的SimpleHTTPServer各类Web应用程序需要加载资源通过Ajax调用等地方发展

当我在网址中使用查询字符串,服务器将始终重定向到标有斜线相同的URL。

例如/folder/?id=1重定向到/folder/?id=1/使用HTTP 301响应。

我只是开始使用服务器python -m SimpleHTTPServer

任何想法我怎么能摆脱重定向行为? 这是Python的2.7.2。

Answer 1:

要做到这一点,以确保查询参数保持他们应该正确的做法,是确保你做文件名的请求,而不是直接让的SimpleHTTPServer重定向到您index.html

例如http://localhost:8000/?param1=1确实重定向(301)和改变的URL http://localhost:8000/?param=1/ ,其与查询参数弄乱。

然而http://localhost:8000/index.html?param1=1使索引文件明确)加载正确。

因此,只要不让SimpleHTTPServer做一个URL重定向解决了这个问题。



Answer 2:

好的。 随着莫滕的帮助下,我想出了这一点,这似乎是我所需要的:简单地忽略查询字符串,如果他们在那里,服务于静态文件。

import SimpleHTTPServer
import SocketServer

PORT = 8000


class CustomHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):

    def __init__(self, req, client_addr, server):
        SimpleHTTPServer.SimpleHTTPRequestHandler.__init__(self, req, client_addr, server)

    def do_GET(self):
        # cut off a query string
        if '?' in self.path:
            self.path = self.path.split('?')[0]
        SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self)


class MyTCPServer(SocketServer.ThreadingTCPServer):
    allow_reuse_address = True

if __name__ == '__main__':
    httpd = MyTCPServer(('localhost', PORT), CustomHandler)
    httpd.allow_reuse_address = True
    print "Serving at port", PORT
    httpd.serve_forever()


Answer 3:

我不知道如何生成重定向...我已经试过实现一个非常基本的SimpleHTTPServer,并使用查询字符串PARAMS时,我没有得到任何重定向。

只是这样做self.path.split("/")并在处理请求之前处理的路径? 此代码,你想要做什么,我认为:

import SocketServer
import SimpleHTTPServer
import os


class CustomHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
    def folder(self):
        fid = self.uri[-1].split("?id=")[-1].rstrip()
        return "FOLDER ID: %s" % fid

    def get_static_content(self):
        # set default root to cwd
        root = os.getcwd()
        # look up routes and set root directory accordingly
        for pattern, rootdir in ROUTES:
            if path.startswith(pattern):
                # found match!
                path = path[len(pattern):]  # consume path up to pattern len
                root = rootdir
                break
        # normalize path and prepend root directory
        path = path.split('?',1)[0]
        path = path.split('#',1)[0]
        path = posixpath.normpath(urllib.unquote(path))
        words = path.split('/')
        words = filter(None, words)
        path = root
        for word in words:
            drive, word = os.path.splitdrive(word)
            head, word = os.path.split(word)
            if word in (os.curdir, os.pardir):
                continue
            path = os.path.join(path, word)
            return path

    def do_GET(self):
        path = self.path
        self.uri = path.split("/")[1:]

        actions = {
            "folder": self.folder,
        }
        resource = self.uri[0]
        if not resource:
            return self.get_static_content()
        action = actions.get(resource)
        if action:
            print "action from looking up '%s' is:" % resource, action
            return self.wfile.write(action())
        SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self)


class MyTCPServer(SocketServer.ThreadingTCPServer):
    allow_reuse_address = True

httpd = MyTCPServer(('localhost', 8080), CustomHandler)
httpd.allow_reuse_address = True
print "serving at port", 8080
httpd.serve_forever()

试试看:

HTTP GET /folder/?id=500x - > "FOLDER ID: 500x"

编辑:

好了,如果你还没有使用过的SimpleHTTPServer-东西,你基本上实现基本请求处理程序,实现do_GET(),do_PUT(),do_POST()等。

我通常做的就是解析请求字符串(重新使用),模式匹配,看看我能找到一个请求处理程序,如果没有,处理请求为静态内容如果可能的请求。

你说你要提供静态内容,如果可能的话,那么你应该翻转这种模式匹配周围,并先看看请求的文件的存储相匹配,并且如果没有,那么对阵处理:)



文章来源: Why does SimpleHTTPServer redirect to ?querystring/ when I request ?querystring?