pathinfo 伪静态 详细解析PATH_INFO 和 ORIG_PATH_INFO技术分享

http://www.ape-men.com/bbs/43_1_1.html

服务器环境
linux/apache/mysql

问题描述
        服务器开启了伪静态,并且也设置了伪静态文件.htaccess,但是伪静态不起作用,所有页面都跳转到了首页,我的伪静态文件如下:
  1. RewriteEngine on
  2. AcceptPathInfo On
  3. RewriteBase /
  4. RewriteCond %{REQUEST_FILENAME} !-d
  5. RewriteCond %{REQUEST_FILENAME} !-f
  6. RewriteCond %{REQUEST_URI} !\.(css|js|png|jpeg|gif)$
  7. RewriteRule ^(.*)$ /index.php/$1 [QSA,PT,L]
复制代码解决思路
        1、伪静态文件.htaccess是否起作用,于是我将我将首页修改为index.aaa
  1. RewriteRule ^(.*)$ /index.aaa/$1 [QSA,PT,L]
复制代码       此时发现网站是打不开的,所以断定伪静态文件起作用,并且能够定位到index.php.
        2、此时分析可能是index.php 后的内容获取不到,获取此内容是通过path_info 进行获取,所以检测是否能够获取到path_info
  1. echo $_SERVER['PATH_INFO'];
复制代码       3、打印出来的结果为空白,继续打印$_Server;
  1. echo $_SERVER;
复制代码       打印出的结果为:
  1. array(64) {
  2.   ["DOCUMENT_ROOT"]=>
  3.   string(30) "/usr/home/qxu1780990217/htdocs"
  4.   ["GATEWAY_INTERFACE"]=>
  5.   string(7) "CGI/1.1"
  6.   ["HTTP_ACCEPT"]=>
  7.   string(63) "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
  8.   ["HTTP_ACCEPT_ENCODING"]=>
  9.   string(13) "gzip, deflate"
  10.   ["HTTP_ACCEPT_LANGUAGE"]=>
  11.   string(59) "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2"
  12.   ["HTTP_CACHE_CONTROL"]=>
  13.   string(8) "no-cache"
  14.   ["HTTP_CONNECTION"]=>
  15.   string(10) "keep-alive"
  16.   ["HTTP_COOKIE"]=>
  17.   string(42) "PHPSESSID=5d1dac4ecd19a129494040cd0bee0bfe"
  18.   ["HTTP_HOST"]=>
  19.   string(22) "qxu1780990217.my3w.com"
  20.   ["HTTP_PRAGMA"]=>
  21.   string(8) "no-cache"
  22.   ["HTTP_UPGRADE_INSECURE_REQUESTS"]=>
  23.   string(1) "1"
  24.   ["HTTP_USER_AGENT"]=>
  25.   string(73) "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:56.0) Gecko/20100101 Firefox/56.0"
  26.   ["PATH"]=>
  27.   string(13) "/bin:/usr/bin"
  28.   ["PHPRC"]=>
  29.   string(40) "/var/www/php54/hichina_ini/qxu1780990217"
  30.   ["QUERY_STRING"]=>
  31.   string(0) ""
  32.   ["REDIRECT_DOCUMENT_ROOT"]=>
  33.   string(30) "/usr/home/qxu1780990217/htdocs"
  34.   ["REDIRECT_GATEWAY_INTERFACE"]=>
  35.   string(7) "CGI/1.1"
  36.   ["REDIRECT_HTTP_ACCEPT"]=>
  37.   string(63) "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
  38.   ["REDIRECT_HTTP_ACCEPT_ENCODING"]=>
  39.   string(13) "gzip, deflate"
  40.   ["REDIRECT_HTTP_ACCEPT_LANGUAGE"]=>
  41.   string(59) "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2"
  42.   ["REDIRECT_HTTP_CACHE_CONTROL"]=>
  43.   string(8) "no-cache"
  44.   ["REDIRECT_HTTP_CONNECTION"]=>
  45.   string(10) "keep-alive"
  46.   ["REDIRECT_HTTP_COOKIE"]=>
  47.   string(42) "PHPSESSID=5d1dac4ecd19a129494040cd0bee0bfe"
  48.   ["REDIRECT_HTTP_HOST"]=>
  49.   string(22) "qxu1780990217.my3w.com"
  50.   ["REDIRECT_HTTP_PRAGMA"]=>
  51.   string(8) "no-cache"
  52.   ["REDIRECT_HTTP_UPGRADE_INSECURE_REQUESTS"]=>
  53.   string(1) "1"
  54.   ["REDIRECT_HTTP_USER_AGENT"]=>
  55.   string(73) "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:56.0) Gecko/20100101 Firefox/56.0"
  56.   ["REDIRECT_PATH"]=>
  57.   string(58) "/bin:/bin/sbin/:/usr/sbin/:/usr/bin/:/usr/local/bin/:/sbin"
  58.   ["REDIRECT_QUERY_STRING"]=>
  59.   string(0) ""
  60.   ["REDIRECT_REMOTE_ADDR"]=>
  61.   string(13) "36.24.243.135"
  62.   ["REDIRECT_REMOTE_PORT"]=>
  63.   string(5) "59458"
  64.   ["REDIRECT_REQUEST_METHOD"]=>
  65.   string(3) "GET"
  66.   ["REDIRECT_REQUEST_URI"]=>
  67.   string(11) "/brand.html"
  68.   ["REDIRECT_SCRIPT_FILENAME"]=>
  69.   string(41) "/usr/home/qxu1780990217/htdocs/brand.html"
  70.   ["REDIRECT_SCRIPT_NAME"]=>
  71.   string(11) "/brand.html"
  72.   ["REDIRECT_SERVER_ADDR"]=>
  73.   string(14) "139.129.150.40"
  74.   ["REDIRECT_SERVER_ADMIN"]=>
  75.   string(32) "webmaster@qxu1780990217.my3w.com"
  76.   ["REDIRECT_SERVER_NAME"]=>
  77.   string(22) "qxu1780990217.my3w.com"
  78.   ["REDIRECT_SERVER_PORT"]=>
  79.   string(2) "80"
  80.   ["REDIRECT_SERVER_PROTOCOL"]=>
  81.   string(8) "HTTP/1.1"
  82.   ["REDIRECT_SERVER_SIGNATURE"]=>
  83.   string(0) ""
  84.   ["REDIRECT_SERVER_SOFTWARE"]=>
  85.   string(6) "Apache"
  86.   ["REDIRECT_STATUS"]=>
  87.   string(3) "200"
  88.   ["REDIRECT_UNIQUE_ID"]=>
  89.   string(24) "Wt8iggqjzDYAADQ3dj4AAAAK"
  90.   ["REDIRECT_URL"]=>
  91.   string(11) "/brand.html"
  92.   ["REMOTE_ADDR"]=>
  93.   string(13) "36.24.243.135"
  94.   ["REMOTE_PORT"]=>
  95.   string(5) "59458"
  96.   ["REQUEST_METHOD"]=>
  97.   string(3) "GET"
  98.   ["REQUEST_URI"]=>
  99.   string(11) "/brand.html"
  100.   ["SCRIPT_FILENAME"]=>
  101.   string(40) "/usr/home/qxu1780990217/htdocs/index.php"
  102.   ["SCRIPT_NAME"]=>
  103.   string(10) "/index.php"
  104.   ["SERVER_ADDR"]=>
  105.   string(14) "139.129.150.40"
  106.   ["SERVER_ADMIN"]=>
  107.   string(32) "webmaster@qxu1780990217.my3w.com"
  108.   ["SERVER_NAME"]=>
  109.   string(22) "qxu1780990217.my3w.com"
  110.   ["SERVER_PORT"]=>
  111.   string(2) "80"
  112.   ["SERVER_PROTOCOL"]=>
  113.   string(8) "HTTP/1.1"
  114.   ["SERVER_SIGNATURE"]=>
  115.   string(0) ""
  116.   ["SERVER_SOFTWARE"]=>
  117.   string(6) "Apache"
  118.   ["UNIQUE_ID"]=>
  119.   string(24) "Wt8iggqjzDYAADQ3dj4AAAAK"
  120.   ["ORIG_PATH_INFO"]=>
  121.   string(11) "/brand.html"
  122.   ["ORIG_PATH_TRANSLATED"]=>
  123.   string(40) "/usr/home/qxu1780990217/htdocs/index.php"
  124.   ["PHP_SELF"]=>
  125.   string(10) "/index.php"
  126.   ["REQUEST_TIME_FLOAT"]=>
  127.   float(1524572802.4798)
  128.   ["REQUEST_TIME"]=>
  129.   int(1524572802)
  130. }
  131.  
  132.   
复制代码       发现并没有PATH_INFO,但是有一个ORIG_PATH_INFO
        4、查找php手册,发现
  1. 'ORIG_PATH_INFO'
  2.     Original version of 'PATH_INFO' before processed by PHP.
复制代码       即”ORIG_PATH_INFO“是“PATH_INFO”在被PHP处理之前的版本。
        5、最终解决办法
  1. if ( !isset($_SERVER['PATH_INFO']) && isset($_SERVER['ORIG_PATH_INFO']) ) $_SERVER['PATH_INFO'] = $_SERVER['ORIG_PATH_INFO'];
复制代码完美!
ERROR: Exception in ASGI application Traceback (most recent call last): File "D:\Project\PythonProject\gpt_academic\shared_utils\fastapi_server.py", line 222, in forward_request mp3_audio = AudioSegment.from_file(temp_file, format="mp3") ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\11342\.conda\envs\gptac_venv\Lib\site-packages\pydub\audio_segment.py", line 728, in from_file info = mediainfo_json(orig_file, read_ahead_limit=read_ahead_limit) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\11342\.conda\envs\gptac_venv\Lib\site-packages\pydub\utils.py", line 274, in mediainfo_json res = Popen(command, stdin=stdin_parameter, stdout=PIPE, stderr=PIPE) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\11342\.conda\envs\gptac_venv\Lib\subprocess.py", line 1026, in __init__ self._execute_child(args, executable, preexec_fn, close_fds, File "C:\Users\11342\.conda\envs\gptac_venv\Lib\subprocess.py", line 1538, in _execute_child hp, ht, pid, tid = _winapi.CreateProcess(executable, args, ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ FileNotFoundError: [WinError 2] 系统找不到指定的文件。 During handling of the above exception, another exception occurred: Traceback (most recent call last): File "C:\Users\11342\.conda\envs\gptac_venv\Lib\site-packages\uvicorn\protocols\http\h11_impl.py", line 403, in run_asgi result = await app( # type: ignore[func-returns-value] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\11342\.conda\envs\gptac_venv\Lib\site-packages\uvicorn\middleware\proxy_headers.py", line 60, in __call__ return await self.app(scope, receive, send) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\11342\.conda\envs\gptac_venv\Lib\site-packages\fastapi\applications.py", line 1054, in __call__ await super().__call__(scope, receive, send) File "C:\Usersn什么意思啊
最新发布
03-18
<think>好的,我现在需要解决用户在使用pydubFastAPI时遇到的FileNotFoundError: [WinError 2]系统找不到指定文件的问题。用户提到了涉及pydub、mediainfo、FastAPIuvicorn。首先,我应该回忆一下常见的导致这个错误的原因,并结合用户提供的引用内容来寻找解决方案。 根据用户提供的引用[2],解决FileNotFoundError的一种方法是修改subprocess.py中的shell参数为True。这可能是因为在Windows系统中,某些情况下子进程没有正确找到可执行文件路径,尤其是当程序不在系统的PATH环境变量中时。而pydub在处理音频文件时可能会依赖ffmpeg或mediainfo这样的外部工具,如果这些工具没有正确安装或路径未配置,就会导致这个问题。 首先,我应该检查用户是否安装了必要的工具,比如ffmpegMediaInfo。用户的问题中提到了mediainfo,所以需要确认MediaInfo是否安装,并且其路径是否被系统识别。例如,在Windows上,可能需要将MediaInfo的安装目录添加到系统的PATH变量中,或者在代码中指定绝对路径。 其次,用户提到的引用[2]中提到修改subprocess的shell参数为True,这可能帮助系统在shell环境中查找可执行文件,因为shell环境通常包含用户的PATH变量。不过,这种方法可能存在安全风险,但在开发环境中可能可以接受。 另外,pydub的文档中提到,可以通过设置环境变量来指定ffmpegffprobe的路径,比如AudioSegment.converter = "C:/path/to/ffmpeg.exe"。类似地,如果问题出在mediainfo上,可能需要确保mediainfo的路径正确配置。 此外,用户在FastAPIuvicorn环境下运行,可能需要考虑文件路径的当前工作目录是否正确。例如,如果代码中使用了相对路径,而FastAPI应用启动时的当前目录不同,可能导致文件找不到。这时,使用绝对路径可能更可靠。 可能的解决方案步骤包括: 1. 确认MediaInfoffmpeg已正确安装,并且其可执行文件所在的目录已添加到系统PATH中。 2. 在代码中显式指定pydub使用的工具路径,例如设置AudioSegment.converter或检查mediainfo的调用方式。 3. 修改subprocess的shell参数为True,但需要注意潜在的安全问题。 4. 检查文件路径是否正确,尤其是在使用相对路径时,可能需要转换为绝对路径。 5. 确保在FastAPI应用中正确处理文件上传临时文件的路径。 同时,用户可能在使用pydub的某些功能时,比如打开音频文件,需要依赖外部工具,这时候正确的路径配置是关键。例如,当使用AudioSegment.from_file()时,如果文件路径不存在,或者所需的转换工具不可用,就会引发错误。 还需要考虑权限问题,确保应用有权限访问指定的目录文件。例如,在Windows上,某些目录可能需要管理员权限才能访问。 另外,查看错误堆栈信息可以帮助定位问题发生的具体位置。如果错误发生在调用mediainfo时,可能是因为pydub在后台调用mediainfo命令行工具,而系统找不到该命令。这时,安装MediaInfo并确保其可执行文件在PATH中,或者在代码中指定其完整路径,可能是解决办法。 总结起来,可能的解决步骤是: - 安装MediaInfo配置PATH。 - 在代码中设置正确的工具路径。 - 调整subprocess的shell参数。 - 检查文件路径的正确性。 - 处理FastAPI中的文件上传路径。 需要将这些步骤详细解释给用户,并提供具体的代码示例,比如如何设置路径,如何修改subprocess的参数等。同时,提醒用户关于安全性的问题,如果适用的话。</think>### 解决 `FileNotFoundError: [WinError 2]` 问题(涉及 pydub、mediainfo、FastAPI、uvicorn) #### 问题原因分析 1. **依赖工具未正确安装或路径未配置** - pydub mediainfo 依赖外部工具(如 `ffmpeg`、`mediainfo.exe`),若未安装或系统无法识别路径会报错。 2. **subprocess 调用权限问题** - Windows 系统中子进程未在 Shell 环境中查找命令,导致路径解析失败[^2]。 3. **文件路径处理错误** - FastAPI 上传文件时使用相对路径,但实际运行目录与预期不符。 --- #### 分步解决方案 1. **安装依赖工具并配置系统路径** - **安装 MediaInfo** 下载 [MediaInfo](https://mediaarea.net/en/MediaInfo) 并安装,确保安装时勾选“Add to PATH”选项。 - **安装 ffmpeg** 从 [FFmpeg官网](https://ffmpeg.org/) 下载 Windows 版本,解压后将 `bin` 目录路径(如 `C:\ffmpeg\bin`)添加到系统 `PATH` 变量。 2. **在代码中显式指定工具路径(推荐)** 在 FastAPI 启动时设置 pydub 的依赖路径: ```python from pydub import AudioSegment # 设置 ffmpeg 路径(根据实际安装路径修改) AudioSegment.ffmpeg = "C:\\ffmpeg\\bin\\ffmpeg.exe" AudioSegment.ffprobe = "C:\\ffmpeg\\bin\\ffprobe.exe" ``` 3. **修改 subprocess 调用方式(临时修复)** - 按引用 [^2] 修改 Python 的 `subprocess.py` 文件,将 `shell=False` 改为 `shell=True`。 - **注意**:此方法可能引入安全风险,建议仅在开发环境使用。 4. **处理 FastAPI 文件上传路径** 确保文件保存时使用绝对路径,并检查文件是否存在: ```python from fastapi import FastAPI, UploadFile import os app = FastAPI() @app.post("/upload") async def upload_file(file: UploadFile): # 保存到绝对路径(示例路径需替换为实际目录) save_path = os.path.abspath(f"uploads/{file.filename}") os.makedirs(os.path.dirname(save_path), exist_ok=True) contents = await file.read() with open(save_path, "wb") as f: f.write(contents) return {"path": save_path} ``` 5. **验证 mediainfo 调用** 在 Python 中直接测试 mediainfo 是否可用: ```python import subprocess try: result = subprocess.run(["mediainfo", "--version"], capture_output=True, text=True) print("MediaInfo 版本:", result.stdout) except FileNotFoundError: print("MediaInfo 未正确安装或路径未配置!") ``` --- #### 附加说明 - **安全性**:若需生产环境部署,建议通过配置环境变量或硬编码路径代替修改 `subprocess.py`。 - **FastAPI 静态文件**:使用 `StaticFiles` 中间件管理文件目录,避免路径混乱: ```python from fastapi.staticfiles import StaticFiles app.mount("/static", StaticFiles(directory="uploads"), name="static") ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值