1

如果 URL 不存在,我正在尝试将目录中的文件重定向到 CGI,并在其中进一步处理 URL。由于这也会对 HTML 文档中引用的不存在文件产生影响,因此如果 HTML 文档包含大量不存在的引用(imgs、css 文件、js 文件),则它可以触发整个级联的重定向。当然,在理想的世界中,所有这些都应该存在,但是,好吧......
无论如何,因为我不会使用字符“。” 在我要重定向的任何 URL 中,我认为用“。”排除文件名是一个非常好的主意。在 RewriteCond 中,因为它应该处理 .css、.js 和 .gif/.jpg。
没那么幸运。如果我输入带有“。”的 URL。在浏览器位置,我收到(正确的)消息“找不到文件”,但是当我检查服务器日志时,HTML 模板引用的每个不存在的文件都会传递给 CGI,无论它是否包含“ 。” 或不。css/doc.css将按原样处理images/bg.png所有其他包含“.”的文件。我的 .htaccess 文件包含以下规则:

RewriteEngine  on
RewriteBase /bla
RewriteCond %{REQUEST_FILENAME} !\.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*)  /cgi-bin/env.pl?.template=Main.html&.query=$1 [PT]

但是,在将外部样式表 (css/doc.css) 的 HTML 文件中的一个引用更改为绝对 URL (aka /css/doc.css) 后,它只会引发“找不到文件”错误,如应该按照上面的规则。Apache 是否没有将这些正则表达式应用于相对 URL?

4

1 回答 1

1

首先,当 Apache 接收到 HTTP/HTTPS 请求时,没有任何关系。在向 Web 服务器发送请求之前,浏览器本身会解析相对路径。

现在尝试将您的代码更改为:

Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On
RewriteBase /bla/

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !\.
RewriteRule ^(.+)$ /cgi-bin/env.pl?.template=Main.html&.query=$1 [L,QSA]
于 2013-05-06T17:38:45.493 回答