1

我目前正在为 *.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。

问题似乎在第二节中,但我无法弄清楚出了什么问题......

4

1 回答 1

0

这是我所做的工作:

RewriteCond %{IS_SUBREQ} false
RewriteCond %{REQUEST_URI} /(?!index$)
RewriteCond %{ENV:REDIRECT_STOP} !1
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.+)$ /$1.php [QSA,L,E=STOP:1]

RewriteCond %{IS_SUBREQ} false
RewriteCond %{ENV:REDIRECT_STOP} !1
RewriteCond %{REQUEST_FILENAME}\.src -f
RewriteRule ^(.+)$ /$1.src [L,E=STOP:1]

RewriteCond %{IS_SUBREQ} false
RewriteCond %{ENV:REDIRECT_STOP} !1
RewriteCond %{REQUEST_URI} \.php$ [OR]
RewriteCond %{REQUEST_URI} \.src$
RewriteRule ^(.+)$ - [R=404]

您会注意到我添加了 %{IS_SUBREQ} 位,这有助于解决导致其变为 404 的主页重定向问题。此时,查询字符串方法变得可以接受,并且我确实可以使用该方法,但我'不是那种只管让它那样的人,我知道这是可以做到的,我会做到的(我做到了!)

除了将变量名称从“norewrite”更改为“STOP”(为了清楚起见)之外,我了解到当发生内部重定向时,mod_rewrite 设置的环境变量以“REDIRECT_”为前缀。这就是为什么设置“norewrite”(“STOP”)的值,然后检查同一个变量,不起作用的原因。当我在检查行中将“REDIRECT_”附加到它时,它现在按预期运行。

  • 请求“/awesome”将处理“awesome.php”并返回其输出
  • 请求 '/awesome.php' 将返回 'awesome.php.src' 的内容(这是 'awesome.php' 的符号链接)
  • 请求 'awesome.php.src' 将返回 404

这正是我想要的!希望这也会对其他人有所帮助。

于 2012-08-04T18:18:08.793 回答