【问题标题】:htaccess file - how do these redirects work?htaccess 文件 - 这些重定向如何工作?
【发布时间】:2021-01-10 13:16:06
【问题描述】:

真的很难理解htaccess的工作,我有这段代码:

#Remove slash on the end
RewriteRule ^(.*)/$ $1 [R=301]

#Don't use .php extension in URL
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.+)$ $1.php

#All the directories should be redirected to index.php
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule . index [R=301]

我的根文件夹的结构:index.php.htaccessdir 目录,里面有 test.php 文件。

我知道这个文件会重新执行多次,直到 URL 的更改结束,所以如果我正在写 mysite.ru/index/dir/ 到地址栏(我使用现有的索引文件作为目录,否则,如果我使用单词与现有文件名无关,它可以工作),我期待 404 页面(斜杠删除,dir.php 不存在,索引/目录不存在,文件再次执行,URL 没有改变和它结束了),但我在 error.log 文件中收到 500 个错误和 10 个重定向。 .htacess 文件有问题,我无法理解。

【问题讨论】:

  • 该请求最终调用 index.php 激活 RewriteLog

标签: .htaccess redirect


【解决方案1】:

您可以使用END 标志或RewriteCond %{ENV:REDIRECT_STATUS} ^$ 条件来防止无限重写循环错误。

END 标志适用于 Apache 2.4 或更高版本

RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.+)$ $1.php [END]

以下条件适用于所有版本

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.+)$ $1.php

您收到内部服务器错误(重定向过多)的原因是您的规则多次重写同一个请求。当您请求 /filename/blabla 时,您的规则会被触发。
由于 /filename/blabla 没有映射到现有文件,因此您的条件 RewriteCond %{REQUEST_FILENAME}\.php -f 仅检查第一个路径段 /filename 。条件满足,规则循环触发。

【讨论】:

  • 据我了解,如果完整路径中的文件名不存在,REQUEST_FILENAME 会从头到尾检查每个段,如果我想防止这种情况,我添加[END] 标志,这将停止进一步检查条件(在这种情况下,如果文件不存在则检查每个段),如果存在,则完成 htaccess 的执行?
猜你喜欢
  • 2011-04-27
  • 1970-01-01
  • 2014-10-17
  • 1970-01-01
  • 2013-09-20
  • 2023-03-13
  • 2013-05-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多