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

时间:2017-09-07 15:50:52

标签: php apache .htaccess redirect mod-rewrite

我的joomla网站存在问题。首先,它会创建带有和不带斜杠的URL的重复项。所以我实现了一些htaccess代码来强制使用尾随斜杠。然后它导致软404,即如果我进入一个不存在的页面,我的爬虫中的状态实际上是200这些非现有页面,但它只是一个404页面模板。不是很难404.所以我改变了#34; error.php"文件。

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

如果我停止重定向页面,而不是相同的URL " domain.com/nonexistentpage"将按预期返回硬404,但URL不会重定向到尾部斜杠版本(我需要)。但是,如果我重定向它,它将在404之前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非常缺乏经验。我的想法是,如果文件不存在,则应忽略斜杠重写规则。

2 个答案:

答案 0 :(得分:0)

如果从另一个角度来看,我认为你所说的是:

  1. 如果REQUEST_FILENAME 文件目录
  2. REQUEST_URI没有尾随斜杠
  3. 然后301到带有斜杠的相同网址...

    转换为:

    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]
    

    放弃最后的重写条件并略微更改规则,以便只有在没有尾部斜线的情况下匹配。

答案 1 :(得分:0)

仍然无法解决这个问题。我注意到了一件事。如果我为每个页面添加.html扩展名,那么这些重定向规则就可以运行。 AKA现有和不存在的文件由htaccess正确分隔,并相应地应用规则。但是如果我将它们留下以正斜杠结尾,那么我是否首先添加条件以检查文件或目录是否真实并不重要。他们全部重定向,然后404s不存在的网址,但不是404立即... 无法理解问题所在。