Apache 如何查找忽略重写规则导致 404 的原因

Apache 如何查找忽略重写规则导致 404 的原因

所以我有这个

RewriteCond %{REQUEST_URI} (da-dk)/(.*)(/|\.php)$
RewriteRule ^(da-dk)/(.*)(/|\.php)$ /$2$3 [L]

但由于某些原因,example.com/da-dk/ 显示“404 - 未找到”

我想尝试理解为什么 Apache 会得出这样的结论 - 即它遇到并遵循了哪些规则

答案1

假设这是在根.htaccess文件中......

RewriteRule ^(da-dk)/(.*)(/|\.php)$ /$2$3 [L]

/da-dk/(与 URL 路径匹配)的请求da-dk/与正则表达式不匹配^(da-dk)/(.*)(/|\.php)$,因此不处理/遵循该规则。

因此,除非您有其他符合此请求的规则,否则规则是必须遵守的,因此会出现 404。(至于“遇到”什么规则,嗯,所有其他规则都是遭遇

顺便说一下,前面的状况RewriteCond指令)在这里完全是多余的,应该删除。它除了RewriteRule 图案已经建立。

具体来说,此规则(正则表达式)将匹配以下形式的 URL:

  • /da-dk/.php
  • /da-dk/<foo>/
  • /da-dk/<foo>.php
  • /da-dk/<foo>/<bar>/<baz>/
  • /da-dk/<foo>/<bar>/<baz>.php

它不匹配:

  • /da-dk/<foo>
  • /da-dk/

此规则只是删除/da-dk请求的 URL 上的前缀(大概在希望重写的 URL 与文件系统目录或文件匹配)。

如果/da-dk/应该重写回根,则可以修改上述规则以允许这样做(在此过程中,也可以稍微简化)。例如,尝试以下方法:

RewriteRule ^da-dk/(.+(/|\.php))?$ /$1 [L]

这里,后面的 URL 路径部分da-dk/被制作成选修的(在这种情况下,$1反向引用实际上是空的

通过将量词从 更改*+,这也可以避免匹配(无意义的)URL /da-dk/.php

无需捕获部分da-dk(第一个路径段),因为这部分未在代换字符串(第二个参数)。

反向$1引用现在包含前缀后的整个 URL 路径da-dk/。(不再需要$2$3原来一样。)

相关内容