微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么htaccess会出错,但将所有内容放入新文件夹后一切正常

如何解决为什么htaccess会出错,但将所有内容放入新文件夹后一切正常

所以我有一个网站,并设置了一些htaccess内容,例如errordocument和干净的url重写。 我目前遇到的问题是,改写并不总是有效,并在我的404错误页面上结束。

  • 链接有效:example.com/texts/2
  • 链接也有效:example.com/texts/3
  • 但这不是:example.com/texts/1
  • 这还行不通:example.com/texts/4

尽管它昨天工作了。

我编辑了一些内容,但是由于无法使用,我将其重置为编辑前所做的备份,因此.htaccess完全相同。

有趣的是,如果我将所有内容都放入新文件/test/,即 效果很好。

现在,在编辑.htaccess中的内容后,我不想一直更改文件夹和不同站点间的链接,所以我想知道为什么会出现此问题以及如何防止和修复它。 / p>

我确实搜索了几个小时,却没有发现与我的错误相近的内容

我的.htaccess

Options +FollowSymLinks
RewriteEngine on

ErrorDocument 403 /index.PHP?page=403

RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^([a-zA-Z0-9]+)$ index.PHP?page=$1
RewriteRule ^([a-zA-Z0-9]+)/$ index.PHP?page=$1
RewriteRule ^texts/([0-9]+)$ index.PHP?page=texts&id=$1
RewriteRule ^texts/([0-9]+)/$ index.PHP?page=texts&id=$1

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /404 [L,R=301]

解决方法

您的浏览器已为无效路径缓存了404重定向规则。

尝试清空浏览器的缓存,问题应该消失。

,
ErrorDocument 403 /index.php?page=403

:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /404 [L,R=301]

它已经被识别为缓存问题。但是,如果不是因为您是如何触发404的,那么您本来就不会遇到缓存问题。您是301(永久)将其重定向到/404(虚拟URL),然后进一步重写。这不好。 301会被浏览器永久缓存,但首先您还会丢失所有有关触发404的URL的信息。

为什么不以与配置403相同的方式配置404?即。

ErrorDocument 404 /index.php?page=404

/404的请求似乎可以做到这一点。但是,现在您可以检查请求的元素以分析404。

RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^([a-zA-Z0-9]+)$ index.php?page=$1
RewriteRule ^([a-zA-Z0-9]+)/$ index.php?page=$1
RewriteRule ^texts/([0-9]+)$ index.php?page=texts&id=$1
RewriteRule ^texts/([0-9]+)/$ index.php?page=texts&id=$1

除了混合使用SCRIPT_FILENAMEREQUEST_FILENAME(在此上下文中它们指的是同一事物)之外,RewriteCond指令仅适用于随后的第一个RewriteRule。看来它们应该至少适用于前两个规则。

但是,由于您只是在使斜杠为可选,因此这两个规则可以组合为一个。但是,如果在内部重写中使尾斜杠为可选,则可能会创建“重复内容”。大概只有一个URL是规范的(至少应该是),即。您始终链接到带有或不带有斜杠的URL,而不是两者都链接。因此,您只应重​​写其中之一。如果要同时处理两个URL(带有和不带有尾部斜杠),则应从一个外部“重定向”到另一个。

例如,偏爱不带斜杠的URL(如您的示例中所示),并重定向以斜杠结尾的URL:

Options +FollowSymLinks
RewriteEngine on

ErrorDocument 403 /index.php?page=403
ErrorDocument 404 /index.php?page=404

# Canonical redirect to remove trailing slash from all URLs
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.+)/$ /$1 [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z0-9]+)$ index.php?page=$1

RewriteRule ^texts/([0-9]+)$ index.php?page=texts&id=$1

我还删除了文件的文件系统检查,因为与正则表达式^([a-zA-Z0-9]+)$匹配的请求不太可能映射到真实文件。文件系统检查相对昂贵,因此如果您不需要它们;不要使用它们。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。