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



我正试图将所有到web服务器的请求发送到.cgi脚本,而该脚本不显示在url中(cgi脚本正在运行Python-Flask(
例如,如果您转到以下url:https://example.com/page/page2
它将使用路径/page/page2main.cgi发送请求,但/main.cgi不会出现在url中。此外,我希望这样用户就可以而不是通过访问他们的url来访问任何静态文件

到目前为止,我已经尝试了以下.htaccess文件:

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

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

我也试过:

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

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

如何让htaccess在不出现在url中的情况下向cgi脚本发送请求?

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模式上的!前缀运算符否定正则表达式-当正则表达式不匹配时,规则成功。在.htaccess中使用时,RewriteRule模式上没有斜杠前缀。此处不需要替换字符串上的斜杠前缀。REQUEST_URI服务器变量包含根相对URL路径(包括斜杠前缀(,因此不需要使用RewriteRule模式来捕获。

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

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

这些指令实际上无效(RewriteRule缺少第二个参数(,所以实际上不能执行任何操作?然而,RewriteRule模式.*/main.cgi与您之前所述的URL不匹配,因此,我看不出这会有什么作用。(?(