需要 .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帮助,需要强制www,https,并删除index.php