我的joomla网站有点问题。首先,它会创建带和不带尾部斜杠的urls的副本。因此,我实现了一些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非常缺乏经验。其想法是,如果文件不存在,则应忽略斜杠重写规则。
发布于 2017-09-08 18:58:07
如果你换个角度来看,我想你说的是:
如果REQUEST_FILENAME is a file or directory
REQUEST_URI G29 aREQUEST_FILENAME斜杠,则文件或目录不具有尾随的斜杠
然后301连接到相同的URL,尾部带有斜杠...
翻译过来就是:
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_URI} !.*/$
RewriteRule ^(.*)$ /$1/ [R=301,L]因为[OR]优先于隐式的,并且重写条件基本上被读取为(#1 OR #2) AND #3
尽管你原来的方法只做了一个小小的调整:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .? - [S=1]
RewriteRule ^(.*[^/])$ /$1/ [R=301,L]只需去掉最后重写条件并稍微更改规则,使其仅在没有尾部斜杠时才匹配。
发布于 2017-09-18 15:18:49
还是没能解决这个问题。我确实注意到了一件事。如果我将.html扩展添加到每个页面,那么这些重定向规则就会起作用。也就是存在的和不存在的文件被htaccess和相应的规则正确地分开。但如果我让它们保持原样,并以正斜杠结尾,那么我是否先添加一个条件来检查文件或目录是否真实都无关紧要。他们都重定向,然后它404s不存在的urls,但不是立即404……我不明白问题是什么。
https://stackoverflow.com/questions/46100589
复制相似问题