我正在尝试将 CGI 文件公开为我的文档根目录和 Web 服务器。我不想暴露服务器正在运行 CGI 脚本的事实。
如何将 URL 映射http://host/index.cgi/
回http://host/
Apache2 中?我猜它涉及 mod-rewrite,但我还没有完成所有文档的探索。
以下配置有效,但我猜有一个更完整的解决方案:
RewriteEngine ON
Redirect /index.cgi/ /
我正在尝试将 CGI 文件公开为我的文档根目录和 Web 服务器。我不想暴露服务器正在运行 CGI 脚本的事实。
如何将 URL 映射http://host/index.cgi/
回http://host/
Apache2 中?我猜它涉及 mod-rewrite,但我还没有完成所有文档的探索。
以下配置有效,但我猜有一个更完整的解决方案:
RewriteEngine ON
Redirect /index.cgi/ /
但我猜有一个更完整的解决方案:
如果您想重定向对/index.cgi/
to的请求/
,那么真的不需要其他任何东西。请注意,这RewriteEngine On
是 mod_rewrite 的一部分,该Redirect
指令是 mod_alias 的一部分。您不需要重写引擎来进行重定向。另请注意,这是一个 302 重定向,它不是永久性的。您可能希望在其中包含301
orpermanent
关键字:
Redirect 301 /index.cgi/ /
此外,该Redirect
指令将两个路径节点链接在一起,因此附加到源的任何其他路径都会附加到目标。因此,鉴于上述情况,如果你去:
http://host/index.cgi/some/more/path.txt
浏览器将被重定向到:
http://host/some/more/path.txt
如果您不想要这个,您可以将 a 更改Redirect
为 aRedirectMatch
并使用正则表达式:
RedirectMatch 301 ^/index\.cgi/$ /
使用 mod-rewrite 的正确解决方案。
更新 CGI 脚本以将 URL 重写为所需路径。这意味着 URL 像index.cgi/path
更改为/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