如何用os.environ['PATH_INFO']隐藏URL?CGI伪URL实现求助
搞定CGI伪URL:正确使用
PATH_INFO的姿势 嘿,我来帮你理顺这个问题!你选PATH_INFO的思路完全没问题,但你手动给os.environ['PATH_INFO']赋值的操作是错的——这个变量是Web服务器自动传给CGI脚本的,不是你硬写死的,这就是为啥你的代码没达到预期效果。
下面是完整的实现步骤,以最常用的Apache服务器为例:
1. 先配置Web服务器,让它传递PATH_INFO
首先得让服务器把用户访问的“伪路径”转发到你的index.py,并把伪路径内容塞进PATH_INFO里:
- 确保Apache开启了
mod_cgi和mod_rewrite模块(一般在httpd.conf里去掉对应行的注释就行) - 找到你的网站根目录对应的配置块,添加以下规则:
这个规则的作用是:比如用户访问<Directory "C:/你的网站根目录/path"> # 允许执行CGI脚本 Options +ExecCGI AddHandler cgi-script .py # 核心重写规则:把非真实文件/目录的请求转到index.py RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f # 不是真实文件 RewriteCond %{REQUEST_FILENAME} !-d # 不是真实目录 RewriteRule ^(.*)$ /path/index.py/$1 [L] # 把请求路径追加到index.py后面 </Directory>192.168.0.8/path/fake,服务器会把请求转发到index.py,同时把/fake作为PATH_INFO传给脚本。
2. 修改你的CGI脚本,动态读取PATH_INFO
删掉手动赋值os.environ['PATH_INFO']的代码,改成读取服务器传递的真实值,然后根据伪路径返回不同内容:
#!C:/VenvPython36/Scripts/python.exe import os # 读取服务器传递的PATH_INFO,处理空值情况 fake_path = os.environ.get('PATH_INFO', '') # 去掉开头的斜杠,方便后续判断 clean_fake_path = fake_path.lstrip('/') # 输出标准HTTP头(必须放在最前面) print("Content-Type: text/html\n\n") # 根据伪路径返回不同内容 if clean_fake_path == 'fake': print('<h2>你成功访问了伪URL:/path/fake</h2>') elif clean_fake_path == 'fake/subpage': print('<h2>你成功访问了子伪URL:/path/fake/subpage</h2>') else: print(f'<p>当前访问的伪路径是:{clean_fake_path}</p>')
3. 测试效果
重启Apache服务器,然后尝试访问:
192.168.0.8/path/fake→ 会显示对应伪路径的内容192.168.0.8/path/fake/subpage→ 显示子页面内容192.168.0.8/path/any-random-path→ 显示你输入的随机路径
为啥你之前的代码没用?
你手动给os.environ['PATH_INFO']赋值,相当于把这个变量固定死了,不管用户访问什么路径,脚本里拿到的都是你写死的192.168.0.8/path/fake,完全起不到动态识别伪URL的作用。PATH_INFO的核心价值就是服务器根据用户的请求动态传递路径信息,你覆盖了这个值,自然达不到效果。
如果用的是Nginx或者其他服务器,配置规则会略有不同,但核心逻辑都是一致的:让服务器把用户请求的路径作为PATH_INFO传递给CGI脚本,然后脚本根据这个值处理不同的伪URL。
内容的提问来源于stack exchange,提问作者Xantium
相关产品推荐
相关产品推荐

