如何将所有请求发送到 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 中?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 HAProxy 发送响应而不将请求传递给 Web 服务器