需要 .htaccess 帮助:不存在的 url 301 重定向到 404,而不是直接给出 404

Posted

技术标签:

【中文标题】需要 .htaccess 帮助:不存在的 url 301 重定向到 404,而不是直接给出 404【英文标题】:Need .htaccess help: nonexistent urls 301 redirecting to 404, instead of giving direct 404s 【发布时间】:2018-02-16 10:36:52 【问题描述】:

我的 joomla 网站有问题。起初,它会创建带有和不带有斜杠的 url 副本。所以我实现了一些 htaccess 代码来强制使用斜杠。然后它导致了软 404,也就是说,如果我输入一个不存在的页面,我的爬虫中的状态实际上是 200 对于这些不存在的页面,但它只是一个 404 页面模板。不是硬 404。所以我在“error.php”文件中更改了它。

但是问题是,当我输入任何不存在的 url,如“domain.com/nonexistentpage”(没有尾部斜杠)时,它首先通过 301 规则将其重定向到“domain.com/nonexistentpage/”,然后返回 404。

如果我停止页面重定向,那么同一个 URL “domain.com/nonexistentpage”将按预期返回硬 404,但 URL 不会重定向到尾部斜杠版本(我需要)。但是,如果我重定向它,它将在 404ing 之前为 301。

我的网站上没有任何没有尾随斜杠的页面,所以我希望所有不存在的页面都直接进入我的“error.php”文件,并从 301 规则中排除。我该怎么做?这是我的编码尝试

RewriteCond %REQUEST_URI !-d 
RewriteCond %REQUEST_URI !-f 
RewriteRule .? - [S=1] 
RewriteCond %REQUEST_URI !(.*)/$ 
RewriteRule ^(.*)$ http://www.domainxyz.com/$1/ 
RewriteRule .+ - [L]

我对 htaccess 非常缺乏经验。这个想法是,如果文件不存在,则应该忽略斜线重写规则。

【问题讨论】:

我不相信你可以像这样将 skip 菊花链到RewriteCond... 在这种情况下,skip 命令有效,但是它甚至会选择不存在的真实文件和文件夹,并且它们都跳过了重写规则,因此只有最后一个重写规则适用于所有页面和它们都返回 404。 【参考方案1】:

仍然无法解决这个问题。我确实注意到一件事。如果我在每个页面上添加 .html 扩展名,那么这些重定向规则就会起作用。 AKA 存在和不存在的文件由 htaccess 正确分隔并相应地应用规则。但是,如果我将它们保留为以正斜杠结尾,那么我是否首先添加条件来检查文件或目录是否真实都没有关系。他们都重定向,然后它 404s 不存在的网址,但不是 404 马上.... 无法理解问题可能是什么。

【讨论】:

【参考方案2】:

如果换个角度看,我想你的意思是:

    如果REQUEST_FILENAME文件目录 并且 REQUEST_URI 没有尾部斜杠

然后 301 到带有尾部斜杠的相同 URL...

翻译为:

RewriteCond %REQUEST_FILENAME -f [OR]
RewriteCond %REQUEST_FILENAME -d 
RewriteCond %REQUEST_URI !.*/$
RewriteRule ^(.*)$ /$1/ [R=301,L]

因为[OR]优先于隐含的[AND],所以重写条件基本上读作(#1 OR #2) AND #3


虽然实际上您的原始方法只需稍加调整即可:

RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule .? - [S=1]
RewriteRule ^(.*[^/])$ /$1/ [R=301,L]

只需放弃最终的重写条件并稍微更改规则,使其仅在没有尾部斜杠时匹配。

【讨论】:

啊,我明白了。我之前尝试过使用 request_filename 以及 URI 并以不同的顺序对其进行变体。然而,这些安排都没有,而不是这个(刚刚尝试过)工作。在这种情况下,没有任何反应,即使是非尾随斜杠 url 也按原样返回状态 200 OK。所以基本上看起来它甚至没有把那些目录或页面当作真实的? Ach - 我以为我可以正常工作,但 Firefox 正在从早期测试中加载缓存版本...我认为如果你离开第一行它就可以工作,所以你'仅检查它是否是存在的文件。我敢肯定,如果您将其关闭,大多数浏览器都会在目录中添加尾随 /。 dowp ...当然是REQUEST_FILENAME,如果你想检查它是否是一个文件!您的原始方法实际上只需稍加调整即可工作。 我试过了,在浏览器中它重定向到斜线版本但是,在任何爬虫中,非斜线版本仍然显示 200,斜线版本也是如此,所以它重定向但保留原始版本。所以它给了我重复的内容。 这有点奇怪......爬虫仍然发出 HTTP 请求,因此它应该按预期重定向。除非之前从 301 重定向中缓存了一些东西(我在测试时将它们更改为 302 以避免这种情况)。

以上是关于需要 .htaccess 帮助:不存在的 url 301 重定向到 404,而不是直接给出 404的主要内容,如果未能解决你的问题,请参考以下文章

.htaccess url-rewrite 如果文件不存在

htaccess url重定向参数不起作用

htaccess帮助,需要强制www,https,并删除index.php

htaccess 帮助,从 URL 中删除一个字符串

.htaccess 重写 url 帮助使用 GET 变量指向 URL 中的值 [关闭]

htaccess:根据变量检查文件是不是存在