停止.htaccess重写受保护目录

时间:2015-07-07 13:26:41

标签: php .htaccess mod-rewrite typo3 typo3-6.2.x

简而言之,这是常规的TYPO3 RealURL .htaccess,位于public_html

# * BASIC TYPO3 URL REWRITING *
# -----------------------------
RewriteRule ^typo3$ - [L]
RewriteRule ^typo3/.*$ - [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule .* index.php

它会将不以typo3开头的传入链接(不是文件,目录或符号链接)重定向到中央入口点index.php。

现在我们有一个名为public/user_upload/myDir的.htaccess / httpauth受保护目录。

其.htaccess文件仅包含以下行:

AuthUserFile "/home/user/.htpasswds/public_html/fileadmin/user_upload/myDir/passwd"
AuthType Basic
AuthName "Please authenticate"
require valid-user

只要启用主.htaccess重定向,就无法从该目录访问文件www.mysite.com/public/user_upload/myDir/myfile.pdf

而不是显示httpauth-login-dialogue,这是期望的结果,而index.php的RewriteRule仍然适用。

所以我想通过添加以下行来排除重写该目录:

# * BASIC TYPO3 URL REWRITING *
# -----------------------------
RewriteRule ^typo3$ - [L]
RewriteRule ^typo3/.*$ - [L]
// stop rewriting if myDir is accessed
RewriteRule ^public/user_upload/myDir/.*$ - [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule .* index.php

听起来不错,但不起作用。重写仍然转到index.php。 可能是什么原因?

好像!-d无法检测到目录。也许是因为它受到了保护?

1 个答案:

答案 0 :(得分:1)

我意识到我的问题实际上是关于mod_rewrite和htpasswd之间的冲突。通过Google搜索这些字词,我找到https://www.drupal.org/node/33645,导致https://serverfault.com/questions/55323/disable-mod-rewrite-for-subdirectoryhttp://www.myriadinteractive.com/blog/view/id/29/conflict-between-apache-url-rewriting-and-basic-authentication

  

对于基本身份验证,服务器会写入“401 Unauthorized”   标题然后根据预定义查找错误文档   路径。大多数情况下,错误文档将不存在   您要保护的目录,因此请求由。处理   重写引发404错误的引擎。

解决方案很简单:返回401并关闭受保护目录中的mod_rewrite。

所以每个.htaccess文件都必须这样编辑:

# new
ErrorDocument 401 "Unauthorized Access"
RewriteEngine off

# as before
AuthType Basic
AuthName "MyName"
AuthUserFile "/home/mysite/.htpasswds/public_html/my/path/"
require valid-user