首页 > 解决方案 > 当 public_html 上存在文件时,apache $1 失败

问题描述

我有一个简单的 htaccess 和一个简单的重写规则

AddDefaultCharset UTF-8

#
# page.php
#
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule  ^page/([^.]+)?$ page.php?slug=$1 [L,NC,QSA]

我使用这个规则来显示静态页面很长一段时间。

最近几个月,这个简单的规则在某些服务器(cPanel 和 VirtualMin)中不起作用,并且不明白问题出在哪里。

该规则进行匹配并执行位于 public_html 但 slug 变量为空的 page.php 脚本。

我发现如果我将 page.php 重命名为 _page.php 它工作正常。

更清楚地
说,如果粗体匹配我没有蛞蝓

/([^.]+)?$.php?slug=$1

如果我使用

_page/([^.]+)?$ page.php?slug=$1
page/([^.]+)?$ _page.php?slug=$1
page/([^.]+)?$ page99.php?slug=$1

一切正常。

当然,我有和其他运行良好的规则。只有这个规则是失败的。

任何帮助表示赞赏

标签: .htaccessmod-rewrite

解决方案


看起来 MultiViews 可能在这些不工作的服务器上启用(即slug缺少 URL 参数)。

在文件顶部禁用多视图.htaccess

Options -MultiViews

MultiViews 在默认的 Apache 安装中被禁用,但是,某些共享主机出于某种原因确实在服务器配置中启用了此功能。

MultiViews 基本上支持开箱即用的无扩展 URL。当 MultiViews 启用并且您请求/page(或/page/<something>)时,mod_negotiation 会查找映射到相同基本名称(即。page)的资源,该基本名称将返回适当的 mime 类型(即。text/html)。换句话说,它将查找表单等文件page.phppage.html这发生mod_rewrite 能够处理请求之前,因此缺少 URL 参数(在您的 mod_rewrite 指令中),因为RewriteRule没有得到处理(它不匹配)。

我发现如果我将其重命名page.php_page.php它的工作正常。

是的,因为请求的 URLpage没有映射到物理文件的基本名称。


推荐阅读