.htaccess的重定向行为不一致

时间:2018-07-13 07:37:16

标签: .htaccess mod-rewrite

我得到的结果与我看来完全相同的重定向不一致。谁能看到我所缺少的东西?

这是我的.htaccess文件。您可以看到我正在尝试将3个目录的所有内容重定向到我的file_not_found页面的地方。

问题是只有一个目录可以正确重定向。 “正确”的意思是,它在浏览器的网址栏中显示其正在显示www.hhoprofessor.com/file_not_found。

bak目录有效,但其余的都不起作用。例如,请参见以下示例:

当我输入www.hhoprofessor.com/bak/random_file_name时,它将重定向到www.hhoprofessor.com/file_not_found。这是正确的行为。

当我对其他2个目录执行相同操作时,将得到以下结果:在地址栏中键入www.hhoprofessor.com/inc/random_file_name不会更改,但会正确显示file_not_found页面的内容。当我尝试页面子目录时,结果相同。

我需要他们像/ bak子目录一样进行完全转发。我不明白为什么相同的指令不能以相同的方式运行。

我已经在Chrome和Opera中进行了尝试,它们的行为相同。 Apache版本是2.4.33,这是一个托管的Lamp服务器。

ErrorDocument 404 /file_not_found

Redirect 301 /.htaccess  http://www.hhoprofessor.com/file_not_found

RewriteEngine On
RewriteBase /

# Redirect directories to file_not_found.php:
RewriteRule ^inc/(.*) file_not_found [R,L]
RewriteRule ^bak/(.*) file_not_found [R,L]
RewriteRule ^pages/(.*) file_not_found [R,L]

# require www prefix
RewriteCond %{HTTP_HOST} ^hhoprofessor\.com$ [NC]
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTPS}:s on:(s) 
RewriteRule ^(.*)$ http%1://www\.hhoprofessor\.com/$1 [R=301,L]

# Homepage: /   redirects to http 
RewriteCond %{HTTPS} on
RewriteRule ^$  http://www\.hhoprofessor\.com/ [R=301,L]

另一个可能适用的数据:这是一个附加域,位于主域的子目录中。我在主域.htaccess的顶部添加了以下行,该行应该停止处理进入附加域的所有内容:

RewriteCond %{HTTP_HOST} ^(www\.)?hhoprofessor\.com$
RewriteRule ^.*$ '-' [L]

在浏览该文件时,即使整个主域.htaccess正在处理,我也看不出它如何影响这种情况。

任何人都能看到我所缺少的吗?

2 个答案:

答案 0 :(得分:1)

如果要调试这种行为,首先要采取的措施是分析网络流量和http标头。因此,您已经看到incpages文件夹都以403禁止)代码结尾。您需要更改这些文件夹(可能是递归文件)的权限。

bak文件夹测试输出:

enter image description here

inc(与pages相同)文件夹测试输出:

enter image description here

,从SEO的角度来看,您尝试做的事情不好。您只应保留ErrorDocument 404 /file_not_found并删除重定向规则。它会自动发送404未找到)代码,而不会更改网址。快速提醒:更改网址意味着重定向,在您的情况下,您发送的是302临时移动)代码而不是404,这不是预期的行为。

答案 1 :(得分:0)

好的,这要感谢贾斯汀的回答。虽然,我不确定为什么。所有3个目录的文件许可权和所有权都是相同的。因此,我仍然不知道为什么一个能正常工作,而另外两个却不能正常工作。没有引起403状态代码的许可或所有权问题。迪尔为755,文件为644。

但是我尝试对所有这3个目录700设置权限。此后,所有重定向均按预期进行。但是,这违反直觉。错误的行为是给出状态代码403(禁止)。然后,当我更改权限以使目录确实被禁止时,便使用302对其进行了重定向。但这有效。

顺便说一句,如果可以的话,我会更多投票支持贾斯汀的答案。分析状态码的技巧将在将来帮助我解决问题。我不知道那个。

后来编辑: 我删除了所有重定向,现在仅使用文件权限。我设置了404和403文档,一切正常。值得注意的是,使用ErrorDocument指令会使它们与302代码一起发送。但这应该在SEO方面找到,因为这些都没有链接到任何地方。所有普通页面的状态码为200。