如何将所有请求发送到 CGI 脚本而不出现在 .Htaccess 文件的 URL 中?

Posted

技术标签:

【中文标题】如何将所有请求发送到 CGI 脚本而不出现在 .Htaccess 文件的 URL 中?【英文标题】:How To Send All Requests To A CGI Script Without It Appearing In The URL From The .Htaccess File? 【发布时间】:2021-06-11 08:25:29 【问题描述】:

我正在尝试将所有请求发送到我的 Web 服务器到 .cgi 脚本,但它不会出现在 url 中(cgi 脚本正在运行 Python Flask) 例如,如果您转到此网址: https://example.com/page/page2 它会将请求发送到main.cgi,路径为/page/page2,但是/main.cgi 不会出现在url 中。另外,我希望用户可以通过转到他们的 url 来访问任何静态文件。 到目前为止,我已经尝试了以下 .htaccess 文件:

RewriteCond %REQUEST_FILENAME !-f
RewriteRule ^(.*)$ /main.cgi/$1 [L]

遗憾的是,这允许用户通过访问他们的 url 来访问静态文件。例如,url example.com/static/image.jpg 将返回图像,而不是从 cgi 脚本返回的任何内容。

我也试过了:

RewriteCond %REQUEST_URI !=/main.cgi
RewriteRule .*/main.cgi

但是,这会删除 url 路径。例如,这个 url:example.com/hello 只会被重定向到 example.com

如何让 htaccess 向 cgi 脚本发送请求而不出现在 url 中?

【问题讨论】:

【参考方案1】:
RewriteCond %REQUEST_FILENAME !-f
RewriteRule ^(.*)$ /main.cgi/$1 [L]

这会将所有未映射到真实文件(包括目录)的请求重写为/main.cgi,将请求的 URL 路径作为路径信息传递给您的脚本(您的 CGI 脚本可能期望该路径信息)。我假设这在这方面有效?

要重写一切,您需要删除RewriteCond 指令(正如您稍后所做的那样),但您确实需要防止内部重写/main.cgi 的内部请求,否则会创建一个重写循环(500 错误响应)。

例如:

RewriteRule !^main\.cgi main.cgi%REQUEST_URI [L]

这会将尚未针对/main.cgi 的所有请求重写为/main.cgi/<url>

RewriteRule 上的 ! 前缀运算符 pattern 否定正则表达式 - 当正则表达式不匹配时规则成功。在.htaccess 中使用时,RewriteRule pattern 上没有斜杠前缀。 substitution 字符串上的斜杠前缀在这里不是必需的。 REQUEST_URI 服务器变量包含相对于根的 URL 路径(包括斜杠前缀),因此不需要使用 RewriteRule 模式捕获。

RewriteCond %REQUEST_URI !=/main.cgi
RewriteRule .*/main.cgi

但是,这会删除 url 路径。例如,这个 url:example.com/hello 只会被重定向到 example.com。

这些指令实际上是无效的(RewriteRule 缺少第二个参数),所以实际上不能做任何事情吗?但是,RewriteRule pattern .*/main.cgi 与您之前所说的 URL 不匹配,所以我看不出这会做任何事情。 (?)

【讨论】:

以上是关于如何将所有请求发送到 CGI 脚本而不出现在 .Htaccess 文件的 URL 中?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 CGI.pm 获取整个请求正文?

如何使用 HAProxy 发送响应而不将请求传递给 Web 服务器

laravel - 使脚本自动将请求作为测试发送到所有api

Redis使用lua脚本

fastcgi与cgi的区别

fastcgi与cgi的区别