这些.htaccess命令并不能很好地协同工作

时间:2013-11-17 00:09:32

标签: wordpress apache .htaccess

我在/中有一个wordpress安装,它有以下.htaccess

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

我在/ photo-archive中有一个小的内部照片存档页面,其中包含以下内容.htaccess:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^?]*)$ /photo-archive/index.php?path=$1 [NC,L,QSA]

#AuthType Basic
#AuthName "Photo-Archive-Test"
#AuthUserFile "passwd"
#require valid-user

上面列出的内容有效,但照片档案不受密码保护(因为这些行已被注释掉)。

测试:

  1. 当我取消注释这些行时,我没有获得照片存档首页和密码提示,而是获得了wordpress的404页面。

  2. 如果我注释掉wordpress的.htaccess并取消注释照片存档的.htaccess中的所有行,那么我会获得带有密码保护的照片存档页面

  3. 如果我注释掉照片存档的重写内容并取消注释密码内容,那么我仍然会获得wordpress的404页面。

  4. 所以似乎wordpress在某种程度上正在接受页面受密码保护的事实,然后将结果应用其rewriteEngine代码。

    知道这里发生了什么或如何修复它?

    编辑:只有一行导致问题:需要有效用户

    Edit2:在网上进行一些研究之后,似乎发生了什么,apache正在进入照片存档页面,收到401(未经授权)错误,试图将该错误提供给浏览器,浏览器看起来以某种方式翻页,而wordpress提供了404页面,因为它没有401页面。我不知道如何解决它,但我认为这可能是原因。

2 个答案:

答案 0 :(得分:1)

在你的WP .htaccess中试试这个:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]

RewriteCond %{REQUEST_URI} !/photo-archive [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

答案 1 :(得分:0)

我在wordpress的.htaccess文件的顶部添加了“ErrorDocument 401 /401.html”。

401.html现在只是一个简单的html文件,它可以是任何东西:

<html>401 error</html>

我从这里得到答案:http://wordpress.org/support/topic/htaccess-and-subdirectories

  

.htaccess文件是附加的。每当您请求页面时,Web服务器基本上都会从根目录中通过树下的每个目录(由httpd.conf文件中最接近的匹配指定),并将所有.htaccess文件一起添加。当它遍历它们时,它会解析每一个。稍后.htaccess文件会覆盖以前的文件,但仅适用于相同的指定项目。 RewriteRules是累积的。

     

所以我认为正在进行的是密码保护目录中的授权强制将401响应(“需要授权”)返回给客户端。通常,客户端会获得401并要求输入密码。

     

然而,在这种情况下,这个401响应被WordPress RewriteRules拦截,后者说要将所有内容重写为WordPress。这是因为.htaccess是累积的,而您最接近的匹配目录是根目录。

     

因此,通过在WordPress规则之前强制执行401响应的ErrorDocument,你先占它们(因为文件实际存在,RewriteRules不会对它生效),导致你的401文档被发送而不是重写到WordPress。但是,客户端没有提供有关该文档的废话,它会看到401并要求输入密码。

     

请注意,如果您未能提供三次密码(取决于客户端),您可能会转发回WordPress。这可能是也可能不是你想要的。如果您添加403行,您将获得错误文档或403 Forbidden页面,而不是确定哪一页。

     

其他可能的解决方案:    - 向httpd.conf添加一个新的Directory语句,专门指定受密码保护的目录,从而绕过htaccess搜索路径中的wordpress重写。    - 在wordpress重写的顶部添加另一个重写,仅为该目录抢占它们。

     

但强制​​使用401/403文档对我来说似乎是最好的解决方案,因为它可以与您需要添加的任何受密码保护的子目录一起使用,而无需指定它们。

相关问题