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



我对我的Joomla网站有问题。起初,它将在没有拖延的情况下创建URL的重复。因此,我实施了一些HTACCESS代码来强制拖延斜线。然后,它会导致软404,如果我输入了一个不存在的页面,那么我的爬行者中的状态实际上是这些非现有页面的200个,但这只是一个404页模板。不是一个硬404。所以我在" error.php"文件中更改了。

然而,问题是,当我输入任何不存在的URL时,例如" domain.com/nonexistentpage"(无需拖延斜线),它首先将其通过301规则重定向到" domain.com/nonexistentpage/",然后返回404。

如果我停止重定向页面,而不是同一URL" domain.com/nonexistentPage"将按预期返回硬404,但URL不会重定向到Taild slash版本(我需要)。但是,如果我重定向,它将在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的经验不足。这个想法是,如果不存在文件,则应忽略斜线重写规则。

如果您以另一种方式看待它,我认为您的意思是:

  1. 如果REQUEST_FILENAME 文件目录
  2. 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]

只是抛弃最终的重写条件并稍微更改规则,以便仅在没有落后的斜线时匹配。

仍然无法解决。我确实注意到了一件事。如果我将.html扩展名添加到每个页面,则这些重定向规则可行。又称存在和不存在的文件被HTACCESS正确分开,并且规则相应地应用了。但是,如果我以前向斜杠的结尾将它们留下,那么我是否首先添加条件来检查文件或目录是真实的。它们都重定向,然后是404s不存在的URL,但不是立即404。无法理解问题是什么。

最新更新