传统的用于路由的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]