【问题标题】:htaccess shows "Not Found" if directory does not exist如果目录不存在,htaccess 显示“未找到”
【发布时间】:2021-08-24 17:31:46
【问题描述】:
我想将所有匹配<domain>/something/mypage.htm 的内容重写为something.php?pid=mypage,所以我写了以下.htaccess 文件:
RewriteEngine On
RewriteRule ^([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+).htm$ $1.php?pid=$2
DirectoryIndex home.php
在我的旧虚拟主机提供商上,规则按预期工作,但在新提供商上,当我尝试打开 <domain>/something/index.htm 或类似名称时,它显示“未找到”。但是当我创建一个名为something 的目录时,重写规则按预期工作。
有人知道这里出了什么问题吗?
【问题讨论】:
标签:
apache
.htaccess
mod-rewrite
【解决方案1】:
看起来MultiViews 可能已在新服务器上启用,这将与您的 mod_rewrite 指令冲突。
启用MultiViews 并且您请求/something/mypage.htm(当/something.php 作为物理文件存在时),mod_negotiation 将在之前发出/something.php/mypage.htm 的子请求(即/something.php,路径信息为/mypage.htm)您的 mod_rewrite 指令能够处理请求,因此不会传递 pid 参数。 (您的指令与第一个路径段中的点不匹配,因此 MultiViews 的子请求不匹配。)
如果设置了AcceptPathInfo Off(可能在服务器配置中),则 404 将来自 Apache,或者来自您的脚本,因为没有传递 pid 参数。
当您创建一个名为something 的子目录时,MultiViews 不会重写请求,因为它已经匹配了 something,即。该名称的目录。
您需要确保 MultiViews 在您的 .htaccess 文件顶部被禁用:
Options -MultiViews
注意:默认情况下,Apache 上未启用 MultiViews,但某些共享虚拟主机出于某种原因确实启用了它。它使无扩展名 URL “神奇地”开箱即用,但如果您没有预料到,它实际上会导致更多问题。