Mod_rewrite 排除文件/目录但包括 .php 文件

Mod_rewrite 排除文件/目录但包括 .php 文件

传统的用于路由的mod_rewrite如下:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [L]

但是我想添加一个额外的条件,即如果文件存在(-f 标志),但该文件具有 .php 扩展名,则重写仍将继续。我尝试了几种方法来做到这一点:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_FILENAME} (.php)$
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [L]

使用 OR 以及正则表达式来查找字符串末尾的 .php。这不起作用(即它加载 page.php 而不是 index.php)

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_FILENAME} .php$
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /gadabouting.com/index.php [L]

正则表达式的不同形式会导致内部服务器错误,但没有有用的调试信息(我目前最讨厌软件的地方,质量差的错误消息)。

例子:

domain.com/ -> domain.com/index.php
domain.com/string/ -> domain.com/index.php
domain.com/script.js -> domain.com/script.js
domain.com/string/string2 -> domain.com/index.php
domain.com/folder/file.php -> domain.com/folder/file.php
domain.com/file.php -> domain.com/index.php

即对于不存在的任何文件/路径或根目录中包含 .php 的任何文件,都将遵循重写规则

有人能指出一条规则,该规则可以正确找到 .php 文件,并在 FILENAME 中找到该文件时进行重写吗?

编辑:我刚刚找到了一个可行的解决方案,它满足除 #5 之外的所有示例。它将任何 PHP 文件重写为 index.php,即使该文件位于子目录中。到目前为止,解决这个问题的尝试都没有成功,因为重写日志没有显示它如何评估 RewriteCond 指令。

RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_FILENAME} .php$
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !index.php
RewriteRule ^(.*)$ /gadabouting.com/index.php [L]

答案1

假设我理解你的意思,你只希望重写文档根目录中的 .php 文件,这样的操作应该可以完成工作......

RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_FILENAME} ^[^/]+\.php$
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !index.php
RewriteRule ^(.*)$ /index.php [L]

相关内容