我的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非常缺乏经验。我的想法是,如果文件不存在,则应忽略斜杠重写规则。
答案 0 :(得分:0)
如果从另一个角度来看,我认为你所说的是:
REQUEST_FILENAME
文件或目录REQUEST_URI
没有尾随斜杠然后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立即... 无法理解问题所在。