如何修复Python URL重定向、伪装及访问日志脚本故障?
问题描述
我用requests和Flask写了个Python脚本,想实现URL重定向、伪装功能,同时记录指定URL的访问情况。设计目标是:读取data.csv里的每条URL映射,在服务器上生成对应重定向路径名的txt文件,每次访问都记录访问详情。
目前脚本在cPanel的Python应用部署工具里运行,看起来没有报错,但既不跳转到目标URL,也不记录任何访问信息。
更新:
在stderr日志中发现以下错误:
[UID:1566][760944] Child process with pid: 761215 was killed by signal: 15, core dump: 0......
前端现在显示(可能是缓存问题):
Internal Server Error 500
求解决思路。
代码文件
.htaccess
RewriteEngine On RewriteCond %{REQUEST_URI} ^/(.*)$ RewriteRule ^(.*)$ $main.py [L]
app.py
import os import datetime import requests from flask import Flask, request, redirect app = Flask(__name__) # Load URL redirects from data.txt file def load_redirects(): redirects = {} with open('data.txt', 'r') as file: for line in file: key, value = line.strip().split('|') redirects[key] = value return redirects # Log visitor information to TXT file def log_visitor(url, ip, city, country): timestamp = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') log_entry = f"{timestamp} | IP: {ip} | City: {city} | Country: {country}\n" with open(f"{url}.txt", 'a') as file: file.write(log_entry) # Get visitor's IP address and geolocation def get_visitor_info(): ip = request.headers.get('X-Forwarded-For', request.remote_addr) response = requests.get(f"http://ip-api.com/json/{ip}") data = response.json() city = data.get('city', 'Unknown') country = data.get('country', 'Unknown') return ip, city, country # Route for handling URL redirects @app.route('/<path:url>') def redirect_url(url): redirects = load_redirects() if url in redirects: ip, city, country = get_visitor_info() log_visitor(url, ip, city, country) return redirect(redirects[url]) else: return "URL not found" if __name__ == '__main__': app.run()
data.csv
Ebay|https://ebay.com/ Amazon|https://amazon/
解决思路
- 修正.htaccess的脚本文件名:当前RewriteRule里写的是
$main.py,但实际入口脚本是app.py,这会导致请求无法找到正确的处理文件,直接触发500错误。修改后的规则:RewriteEngine On RewriteCond %{REQUEST_URI} ^/(.*)$ RewriteRule ^(.*)$ app.py [L] - 统一重定向规则的文件名:脚本里加载的是
data.txt,但你实际用的是data.csv,这会导致加载规则时抛出文件不存在的异常,引发500错误。要么把data.csv改名为data.txt,要么修改load_redirects函数里的文件名:with open('data.csv', 'r') as file: - 处理子进程被终止的问题(signal 15):signal 15是正常的终止信号,大概率是cPanel的进程管理因为资源限制或超时杀死了进程,优化方向:
- 给
requests.get添加超时参数,避免外部请求卡住超时:response = requests.get(f"http://ip-api.com/json/{ip}", timeout=5) - 缓存重定向规则,不要每次请求都读取文件,减少IO操作:
# 在全局提前加载一次 redirects = load_redirects() @app.route('/<path:url>') def redirect_url(url): global redirects if url in redirects: # 后续逻辑不变
- 给
- 检查文件写入权限:cPanel部署的Python应用可能没有当前目录的写入权限,导致无法创建日志txt文件。可以指定绝对路径存储日志,或者联系主机商确认目录权限,确保应用用户有写入权限。
- 调整Flask运行方式:不要用
app.run()的开发服务器,cPanel的Python部署工具通常要求用WSGI模式运行,确保部署时指定了正确的入口(比如app.py里的app对象)。 - 开启详细日志排查:在
app.py开头添加日志配置,获取更详细的错误信息:import logging logging.basicConfig(level=logging.DEBUG)
内容的提问来源于stack exchange,提问作者Daniel Mizr
相关产品推荐
相关产品推荐

