我正试图公开一个CGI文件作为我的文档根目录和web服务器。我不想暴露服务器正在运行CGI脚本的事实。
如何在Apache2中将URL http://host/index.cgi/
映射回http://host/
?我猜这涉及到mod重写,但我还没有完成所有的文档。
以下配置正在运行,但我猜还有一个更完整的解决方案:
RewriteEngine ON
Redirect /index.cgi/ /
但我猜还有一个更完整的解决方案:
如果您想将/index.cgi/
的请求重定向到/
,那么实际上不需要其他任何东西。注意,RewriteEngine On
是mod_rewrite的一部分,Redirect
指令是mod_alias的一部分。重定向工作不需要重写引擎。还要注意,这是一个302重定向,它不是一个永久的重定向。您可能希望在其中包含301
或permanent
关键字:
Redirect 301 /index.cgi/ /
此外,Redirect
指令将两个路径节点链接在一起,因此附加到源的任何其他路径都将附加到目标。因此,鉴于上述情况,如果你去:
http://host/index.cgi/some/more/path.txt
浏览器将被重定向到:
http://host/some/more/path.txt
如果您不希望这样,您可以将Redirect
更改为RedirectMatch
,并使用正则表达式:
RedirectMatch 301 ^/index.cgi/$ /
使用mod重写更正解决方案。
-
更新CGI脚本以将URL重写为所需路径。这意味着像
index.cgi/path
这样的URLS将变为/app1/path
,或者在我的情况下,仅为/path
。对于我的脚本,有一个名为virutal-root
的选项进行了全局更改。 -
然后用以下指令编译Apache。它所做的是在内部重写所有URL以包括CGI脚本,但忽略指向实际脚本的URL。
RewriteEngine ON RewriteCond %{REQUEST_URI} !^/index.cgi RewriteRule ^(.*)$ /index.cgi/$1 [PT]
-
一个关键点是,如果CGI脚本引用服务器上的任何静态文件,则需要将它们放置在重写规则之外的路径中。例如,在RewriteRule:之前排除另一条路径
RewriteCond %{REQUST_URI} !^/_static