使用友好的URL进行.htaccess身份验证

3

我想配置我的 .htaccess 文件,在我们的开发网站上启用基本认证。

我希望认证在我的整个网站上生效,但对于某些特定的URL则不需要。我们在网站上使用友好的URL。

我还希望对某些文件类型,如png、css等进行身份验证的绕过。

到目前为止,我的代码看起来像这样:

SetEnvIfNoCase Request_URI ^/upload/ NO_AUTH
AuthName "Restricted Area"
AuthType Basic
AuthUserFile /path/to/.htpasswd
Require valid-user
Satisfy  any
Order deny,allow
Deny from all
Allow from env=NO_AUTH
<FilesMatch "\.(gif|jpe?g|png|css|js|swf)$">
    Satisfy Any
</FilesMatch>

认证工作正常,但 SetEnvIfNoCase 似乎不起作用,因为当访问友好的URL'/upload/'时仍会要求认证。 FilesMatch 部分也似乎没有起作用... 有人能帮助我解决吗? 谢谢!
1个回答

1

你需要处理两件事。

  1. <FilesMatch> 容器没有起到作用。你已经有了一个 Satisfy Any。你应该把这些扩展名添加到单独的 SetEnvIfNoCase 中。

  2. 当你使用重写规则来重写 /upload/ 时,你需要包括“友好”的 URI 和重写后的 URI,因为身份验证模块在每一步都被应用(显然,通过重写/别名绕过身份验证非常糟糕)。这意味着,例如,如果你有以下规则:

    RewriteRule ^upload/(.*)$ /upload_script.php?file=$1 [L]
    
然后,您需要在/upload//upload_script.php两个路径中都添加一个NO_AUTH行:
SetEnvIfNoCase Request_URI ^/upload/ NO_AUTH
SetEnvIfNoCase Request_URI ^/upload_script.php NO_AUTH

然后针对问题#1:
SetEnvIfNoCase Request_URI \.(gif|jpe?g|png|css|js|swf)$ NO_AUTH

以下是建议的示例:

您可以尝试的一种方法是添加一条规则(类似于上面的 RewriteRule 示例),将 /upload/ 路由到一个中间脚本,而不是 index.php,然后从中间脚本调用 index.php

所以使用上面的 /upload_script.php 示例,在任何规则之前添加此内容:

RewriteRule ^upload/ /upload_script.php [L]

这段文字的英译中文为:

所以它看起来像:

RewriteEngine On 

RewriteRule ^upload/ /upload_script.php [L]

RewriteCond %{REQUEST_FILENAME} -s [OR] 
RewriteCond %{REQUEST_FILENAME} -l [OR] 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^.*$ - [NC,L] 

RewriteRule ^.*$ index.php [NC,L]

接下来,您需要创建一个名为upload_script.php的脚本,该脚本将包含以下内容:

<?php
  include_once "index.php";
?>

您可能需要先转储$_SERVER['']数组,以查看是否设置为Zend的index.php所期望的内容。


感谢您的回答。我已经按照您的建议解决了问题#1,但是对于问题#2,由于我正在使用Zend Framework,我必须允许我的引导程序“index.php”,这将删除所有身份验证。您有其他建议吗?顺便说一下,我无法为您的答案投票,因为我没有足够的声望 :/ - Jeff
1
@Jeff,我对Zend或您的设置并不是很熟悉,但您可以尝试添加一个规则(类似于上面的RewriteRule示例),将/upload/路由到除index.php之外的中间脚本,然后从中间脚本调用index.php - Jon Lin
我对如何使其工作感到困惑,因为我已经有一些RewriteCondRewriteRule。 我目前有以下代码:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L] 您认为您能告诉我如何将您的建议与该代码混合使用吗?
- Jeff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接