Mod - Apache 2.4.12 的 Rewrite / .htaccess 问题

Mod - Apache 2.4.12 的 Rewrite / .htaccess 问题

文件结构如下

  • 公共文件:/home/usrname/public_html
  • 软件运行所在的CGI BIN:/home/usrname/public_html/cgi-bin
  • 私人文件:/home/usrname/public_html/_private
  • 数据库:/home/usrname/public_html/_private/data

我想要做的是将下面的代码从 Apache 1.3.42 转换为 Apache 2.4.12 .htaccess 文件,似乎 SSL 路径中的几个更改是我真正主要关心的。

当您尝试使用 SSL 路径的任何文档时,我所看到的都是 _private 路径,而不是任何文件类型(如 CSS、js 图像等)的 HTML 源中的 public_html 路径。

我还遇到了权限问题,它要求我在 SSL 模式下登录,这一定是由于其他.htaccess文件之一造成的。这应该很简单,但不知何故我还没有正确地在线获取规则。

以下是每个 .htaccess 文件中的代码行。

公共文件:/home/usrname/public_html

RewriteEngine On

RewriteCond %{HTTP_HOST} ^99\.00\.99\.000$
RewriteRule ^/?(.*)$ http://www.example.com/$1 [R=301,L]

RewriteCond %{HTTP_HOST} ^example.com$
RewriteRule ^/?(.*)$ http://www.example.com/$1 [R=301,L]

RewriteCond /home/usrname/public_html/%{REQUEST_FILENAME} -f
RewriteRule ^(.+) /home/usrname/public_html/$1 [L]
RewriteCond /home/usrname/public_html/_private/%{REQUEST_FILENAME} -f
RewriteRule ^(.+) /home/usrname/public_html/_private/$1 [L]
RewriteRule ^(.+) - [PT]

DirectoryIndex home.html index.htm index.html default.htm Default.htm
Action cgi-ccd /cgi-bin/aws.emp
AddHandler cgi-ccd html
AddHandler default-handler .gif
AddHandler default-handler .jpg

<FilesMatch "\.(inx|weo|lco|dbo|cdo|fpo|dao)">
Order Allow,Deny
Allow from env=local_ref
</FilesMatch>

<Files 403.shtml>
order allow,deny
allow from all
</Files>

我们还在.htaccess帐户的各自路径中拥有这些文件。

私人文件:/home/usrname/public_html/_private

AuthUserFile .htpasswd
AuthGroupFile /dev/null
AuthName Administrator
AuthType Basic
<limit GET>
require valid-user
</limit>

数据库:/home/usrname/public_html/_private/data

AuthUserFile .htpasswd
AuthGroupFile /dev/null
AuthName Administrator
AuthType Basic
<limit GET>
require valid-user
</limit>

CGI BIN:/home/usrname/public_html/cgi-bin

Options +ExecCGI
Order allow,deny
Allow from all

也许这些工作方式存在问题,而这正是 Apache 2.4+ 中的问题所在?也许是从 CGI-BIN 目录调用文件的权限问题,如果需要,我可以移动它吗?

301 重定向相当简单,看起来不错。该版本的语法可能需要更改,但它们似乎足够简单,易于编程。我认为与 Options FollowSymLinks SymLinksIfOwnerMatch ExecCGI Includes MultiViews 或其他组合存在冲突;我尝试了几种组合,但都没有成功。

最后,我试图屏蔽软件的完整路径 cgi-bin 路径,但将旧路径作为 301 重定向提供回来,这样我们就不会丢失任何可能被索引或书签的链接。

。IE

From: http://www.example.com/cgi-bin/aws.emp/any-document-file-name.html
To: http://www.example.com/any-document-file-name.html

或处于 SSL 模式。

From: https://www.example.com/cgi-bin/aws.emp/any-document-file-name.html
To: https://www.example.com/any-document-file-name.html

我发现如果我将以下内容从 更改为%{REQUEST_FILENAME}至少%{REQUEST_URI}可以让一切都正常工作,除非您需要 SSL 路径,否则它会显示任何文件类型的 _private 路径,例如 css、js、图像等。

我希望我提供的信息足以帮助解决这个棘手的问题,遗憾的是我对 mod_rewrites 非常不熟悉,因此现在它看起来有点像黑魔法。我可能需要数周时间才能独自解决简单的事情。

非常感谢您的帮助,我非常想从 Apache 1.3.42 迁移,因为它已经过期了,一旦这个问题解决了我就可以。

答案1

我发现如果我将以下内容从 更改%{REQUEST_FILENAME}%{REQUEST_URI}至少可以让一切正常工作

如果您指的是以下代码块(据称在根.htaccess文件中):

RewriteCond /home/usrname/public_html/%{REQUEST_FILENAME} -f
RewriteRule ^(.+) /home/usrname/public_html/$1 [L]
RewriteCond /home/usrname/public_html/_private/%{REQUEST_FILENAME} -f
RewriteRule ^(.+) /home/usrname/public_html/_private/$1 [L]
RewriteRule ^(.+) - [PT]

那么这只有一点点意义。问题是,如果在 中使用,这些指令在 Apache 1.3 上也不会起作用.htaccess

“问题”在于该.htaccess文件的内容看起来就像是直接从服务器配置中取出的。在.htaccess上下文中,这些指令永远不会匹配,无论是否REQUEST_FILENAME更改为REQUEST_URI。在服务器配置中使用时,REQUEST_FILENAME与相同REQUEST_URI,但 in.htaccess REQUEST_FILENAME是请求映射到的绝对文件系统路径。因此,REQUEST_URI在这种情况下使用只是“不太错误”,它仍然不正确。

在 中重写/home/usrname/public_html/...(绝对文件系统路径)无效.htaccess。如果成功执行,将导致 400 错误请求。

但是,这些指令实际上看起来好像什么都没做。它们只是将请求重写回同一个文件 - 这没什么意义 - 所以很难看出这些指令的意图是什么?它们是不是旨在阻止其他指令运行(例如,防止请求传递给 CGI 脚本)?

有些与 Options FollowSymLinks SymLinksIfOwnerMatch ExecCGI Includes MultiViews 等有冲突

您需要FollowSymLinksSymLinksIfOwnerMatch设置 mod_rewrite 才能运行。并且您可能需要禁用MultiViews

相关内容