.htaccess - 当 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
一切正常。
当然,我有和其他运行良好的规则。只有这个规则是失败的。
任何帮助表示赞赏
解决方案
看起来 MultiViews 可能在这些不工作的服务器上启用(即slug
缺少 URL 参数)。
在文件顶部禁用多视图.htaccess
:
Options -MultiViews
MultiViews 在默认的 Apache 安装中被禁用,但是,某些共享主机出于某种原因确实在服务器配置中启用了此功能。
MultiViews 基本上支持开箱即用的无扩展 URL。当 MultiViews 启用并且您请求/page
(或/page/<something>
)时,mod_negotiation 会查找映射到相同基本名称(即。page
)的资源,该基本名称将返回适当的 mime 类型(即。text/html
)。换句话说,它将查找表单等文件page.php
。page.html
这发生在mod_rewrite 能够处理请求之前,因此缺少 URL 参数(在您的 mod_rewrite 指令中),因为RewriteRule
没有得到处理(它不匹配)。
我发现如果我将其重命名
page.php
为_page.php
它的工作正常。
是的,因为请求的 URLpage
没有映射到物理文件的基本名称。
推荐阅读
- bootloader - MPLAB X IDE:为 PIC32 编写引导加载程序应用程序
- python - RedisPub Sub 阻塞 IO
- python - Python:AttributeError:'NoneType'对象没有属性'start'
- java - Java HTTP 客户端是否处理压缩
- javascript - 似乎无法在循环中应用 classList.toggle
- android - 在 AsyncTask 事件之间使用共享变量
- load-balancing - F5 - A10 负载均衡器迁移
- sql - SQL Server - 分组依据 - 附加列
- java - 锁定一个随机数组,以便可以从其他方法处理它而不会被随机化
- python - Gitlab CI/CD 中的 Tika-OCR python 测试