我目前正在为 *.php 返回 404 错误,并在内部将所有请求重定向到 PHP 文件(如果存在),使用以下命令:
RewriteCond %{REQUEST_URI} /(?!index$)
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.+)$ /$1.php [QSA,L,E=norewrite:1]
RewriteCond %{ENV:norewrite} !1
RewriteCond %{REQUEST_URI} \.php$
RewriteRule ^(.+)$ - [R=404]
这工作正常。但是,我希望能够从文件(例如 index.php.src)提供 PHP(或其他)源(具有适当的扩展名),同时让 index.php.src 如果直接访问也返回 404。
RewriteCond %{REQUEST_URI} /(?!index$)
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.+)$ /$1.php [QSA,L,E=norewrite:1]
RewriteCond %{ENV:norewrite} !1
RewriteCond %{REQUEST_FILENAME}\.src -f
RewriteRule ^(.+)$ /$1.src [L,E=norewrite:1]
RewriteCond %{ENV:norewrite} !1
RewriteCond %{REQUEST_URI} \.php$ [OR]
RewriteCond %{REQUEST_URI} \.src$
RewriteRule ^(.+)$ - [R=404]
这似乎不起作用。它在内部重定向到 index.php,然后到 index.php.src,然后是 404s。
有趣的是,在第一个示例中,环境变量确实阻止了第二个规则集的执行,并且页面按预期加载。当我添加您在第二个示例中看到的中间规则集时,环境变量似乎不再有任何效果。如果我从第二个示例中删除第二个规则集,将附加行保留在最后一个规则集中,它的行为就像第一个示例一样(除了请求例如 index.php.src 返回一个 404,这是我想要的) .
由于各种原因,为此目的使用查询字符串是不可接受的,它必须是环境变量。
我怎样才能使这项工作?我究竟做错了什么?
编辑: 如果我解释得不好(我很确定我做到了)......
- 存在以下两个文件:“index.php”和“index.php.src”
- 如果我使用第一组规则请求 http://domain.com/,我会得到我的主页(如预期的那样)。使用第二组规则,我得到一个 404。使用第二组规则,减去第二节,我得到我的主页(如预期的那样)。
- 如果我使用任一组规则请求 http://domain.com/index,我会得到 404,正如预期的那样。
- 如果我使用任一组规则请求 http://domain.com/index.php,我会得到 404。这是预期的第一组,但我希望得到“index.php.src”的内容。
- 如果我使用第一组规则请求 http://domain.com/index.php.src,我会得到“index.php.src”的内容,正如预期的那样,因为 *.src 上的 404 规则不是在那个集合中。无论有没有第二节,我在第二组中都得到了预期的 404。
问题似乎在第二节中,但我无法弄清楚出了什么问题......