htaccess 文件在 apache 2.2 中有效,但在 apache 2.4 中无效 - aws beanstalk 托管

Posted

技术标签:

【中文标题】htaccess 文件在 apache 2.2 中有效,但在 apache 2.4 中无效 - aws beanstalk 托管【英文标题】:htaccess file works in apache 2.2 but not in apache 2.4 - aws beanstalk hosted 【发布时间】:2021-12-17 06:53:03 【问题描述】:

我需要让这个 .htaccess 文件在 Apache 2.4 中工作。看来 Apache 2.4 不喜欢

Order Allow,Deny
Deny from all

我改成

  <FilesMatch "\.(htaccess|htpasswd|ini|psd|log|sh|crt|gitignore|md)$">
          Require all denied
    </FilesMatch>

到目前为止,我在实现它时看到了一些错误:

AH10244: invalid URI path (/cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh)
AH01797: client denied by server configuration: /var/www/html/

这是我试图在 Apache 2.4 中使用的.htaccess 文件。你能发现其他 Apache 2.4 不喜欢的东西吗?

    Options -Indexes
    
    <FilesMatch "\.(htaccess|htpasswd|ini|psd|log|sh|crt|gitignore|md)$">
        Order Allow,Deny
        Deny from all
    </FilesMatch>
    <Files 8fjfsuUhhhhh8/*>
        deny from all
    </Files>
    <Files backups/*>
        deny from all
    </Files>
    <Files stats/*>
        deny from all
    </Files>
    <Files icons/*>
        deny from all
    </Files>
    <Files error/*>
        deny from all
    </Files>
    <Files logs/*>
        deny from all
    </Files>
    <Files git/*>
        deny from all
    </Files>
    <Files .git/*>
        deny from all
    </Files>
    <IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteBase /
        RewriteRule ^blog/(.*)$ https://blog.mysite.com/$1 [R=301,NC,L]
    
        # Old Site Redirects
        RewriteRule ^retailers($|/$) /merchants/ [R=301,NC,L]
        RewriteRule ^faqs($|/) /FAQ/ [R=301,NC,L]
        RewriteRule ^contact($|/) /contact-us/ [R=301,NC,L]
        RewriteRule ^login($|/) /customer-login/ [R=301,NC,L]
        RewriteRule ^bank-vision($|/) /FAQ/ [R=301,NC,L]
    
        # New Website Proxying
        # Handle Request to index
        RewriteCond %THE_REQUEST ^GET\ /\ .*
        RewriteRule . http://mysite.com.s3-website.eu-west-2.amazonaws.com/ [P]
    
        # Handle all the named pages
        RewriteRule ^(merchants|how-it-works|shop-directory|contact-us|terms-of-use|privacy-policy|complaints-policy|careers|FAQ|error)($|/) http://mysite.com.s3-website.eu-west-2.amazonaws.com/$1$2 [P]
    
        # Handle the various static elements
        RewriteRule ^static/(.*)$ http://mysite.com.s3-website.eu-west-2.amazonaws.com/static/$1 [P]
        RewriteRule ^page-data/(.*)$ http://mysite.com.s3-website.eu-west-2.amazonaws.com/page-data/$1 [P]
        RewriteRule ^([^\/]*).js$ http://mysite.com.s3-website.eu-west-2.amazonaws.com/$1.js [P]
        RewriteRule ^icons-(.*)/(.*)\.(png|jpg)$ http://mysite.com.s3-website.eu-west-2.amazonaws.com/icons-$1/$2.$3 [P]
    
        # Handle request to homepage with get parameters
        RewriteCond %THE_REQUEST ^GET\ /\?utm_source=([^\s&]+)
        RewriteRule . http://mysite.com.s3-website.eu-west-2.amazonaws.com/ [P]
        RewriteCond %THE_REQUEST ^GET\ /\?ref=([^\s&]+)
        RewriteRule . http://mysite.com.s3-website.eu-west-2.amazonaws.com/ [P]
    
        # Legacy Platform stuff
        RewriteRule ^(frontend/process/process/components|admin-lf7/ui/ajax|frontend/ajax|8fjfsuUFks988/cron)($|/) - [L]
        RewriteRule ^rt8aglCo7XfQOxxQH2mTDZw45675675675567P27da4t1T1yJIB5Be58ih /admin.php [L]
        RewriteCond %REQUEST_FILENAME !-f
        RewriteCond %REQUEST_FILENAME !-d
        RewriteRule . /index.php [L]
        RewriteCond %THE_REQUEST ^[A-Z]+\ /[^?\ ]*\.php[/?\ ]
        RewriteRule .*\.php$ index.php [L]
    </IfModule>

当我使用来自 AWS beanstalk 示例的 .htaccess 文件时,我可以看到该站点正常:

<IfModule mod_rewrite.c>
    Options -MultiViews

    RewriteEngine On
    RewriteCond %REQUEST_FILENAME !-f
    RewriteRule ^ index.php [L]
</IfModule>

【问题讨论】:

你的&lt;Files&gt; 指令看起来都不匹配任何东西?例如。你期望&lt;Files logs/*&gt; 匹配什么? &lt;Files&gt; 指令仅匹配 filenames,而不匹配文件路径。并且其中一些 mod_rewrite 指令看起来不像他们正在做你认为他们正在做的事情?我认为您可能遇到的一些问题只是服务器配置的差异,而不是 Apache 2.2 和 2.4 本身之间的差异。 (?) 您的原始指令假定 DirectoryIndex 设置正确,但后来的 .htaccess 文件避免了这样做的需要。 @MrWhite 我检查了&lt;Files&gt; 指令,它们与目录匹配,但与目录中的文件不匹配。我取出了所有涉及 s3 存储桶的 mod_rewrite 指令,并且能够让网站加载。 【参考方案1】:

Order Allow,Deny Deny from all 向后兼容 Apache 2.4,因此您应该可以使用旧配置。

错误AH10244: invalid URI path (/cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh) 实际上是在尝试利用您的服务器,而您的 apache 正确地否认了这一点。

您是否正确测试了 FilesMatch ?喜欢尝试访问:yourpage.com/.htaccess?结果,您应该在日志中看到您的第二个“错误”AH01797: client denied by server configuration: /var/www/html/,这意味着您的 .htaccess 和 FilesMatch 应该可以正常工作

【讨论】:

"Order Allow,Deny Deny from all 向后兼容 Apache 2.4" - 嗯,有点。这些指令已移至 mod_access_compat(以前已弃用)。此模块现在是“扩展”(与“基本”模块相反),因此默认情况下未启用。在 AWS 上,他们可能需要显式启用此模块(或将指令转换为使用 mod_authz_host - 这会更好)。 第二个“错误”表示对/var/www/html/(看起来可能是文档根目录)的请求被阻止,而不是.htaccess。这可能是由于新旧访问控制指令之间的冲突造成的。 @MrWhite 你是对的,我的回答是错误的,想删除它,但你的 cmets 是正确的。也许你可以重新发布你所有的 cmets 作为答案

以上是关于htaccess 文件在 apache 2.2 中有效,但在 apache 2.4 中无效 - aws beanstalk 托管的主要内容,如果未能解决你的问题,请参考以下文章

.htaccess for apache 2.2 不适用于 apache 2.4 vagrant 开发框

apache 2.2 (ubuntu) 不允许我通过.htaccess 设置php 错误报告?

在Apache中使用.htaccess文件

mod_rewrite 的问题 // Apache 2.2 // OpenSUSE 11.3

浅谈.htaccess文件--避免滥用.htaccess文件

XAMPP/Apache 文件夹中的 .htaccess 未找到错误 404