文件结构如下
- 公共文件:
/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 等有冲突
您需要FollowSymLinks
或SymLinksIfOwnerMatch
设置 mod_rewrite 才能运行。并且您可能需要禁用MultiViews
。