所以我有这个
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
原来一样。)