我正在运行 Apache 2.2.11
.htaccess
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)$ $1.php [L,QSA]
问题:
http://localhost/index
正确地给我主页(index.php),但我也可以通过以下网址访问同一页面。
http://localhost/index/
http://localhost/index/blahblah
http://localhost/index/blahblah/blah/blah/blah
http://localhost/index.php/
http://localhost/index.php/blahblah/
http://localhost/index.php/blahblah/blah/blah
我想确保只有 localhost/index 会打开 localhost/index.php,除 localhost/index 之外的任何内容(甚至 localhost/index.php)都应该返回 404。
我想我必须添加另一个RewriteCond
来捕获除现有 Request_Filename.php 文件之外的所有其他文件。除了 localhost/index 以外,其他所有页面如何获得 404 错误?
(SO 上也有这个问题,并且有悬赏,但我想 serverfault 可能是更好的选择。) 更新 .htaccess 有什么用?htaccess 文件的目的是启用更干净的 URL,如 localhost/index 而不是 localhost/index.php。更多解释可以在该代码的来源
答案1
鉴于问题范围的变化,我将再次尝试回答它......
.htaccess 有什么作用?
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)$ $1.php [L,QSA]
- 如果请求的 URI 不是有效文件则匹配。
- 如果请求的 URI 不是有效目录则匹配。
- 如果请求的 URI 加上“任意单个字符”加上“php”则匹配是 一个有效的 PHP 文件(请注意,这将与“index.php”一样匹配“index-php” - 如果您想要文字匹配,则应该转义句点字符)。
- 将请求传递到“请求字符串是什么”(
^(.*)$
)加上“.php” - 附加查询字符串([QSA]
)并停止处理此规则后的 mod_rewrite 指令([L]
)。
这些规则存在一些严重的问题 - 例如,如果您创建一个名为“index”的目录,请求“domain.com/index”的用户将获得该目录,而不是您的 index.php 文件。
鉴于您声明的意图:
我想确保只有 localhost/index 会打开 localhost/index.php,除 localhost/index 之外的任何内容(甚至 localhost/index.php)都应该返回 404。
...我建议采取以下措施:
.htaccess
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/index$
RewriteRule .* /index.php [L,QSA]
索引.php
if ( $_SERVER['REQUEST_URI'] != '/index' ) {
header("Status: 404 Not Found");
require( '404.html' );
die();
}
更新:
如果 index.php 中没有脚本,我该如何做同样的事情?
据我所知,如果不调用临时解决方案,就无法做到这一点,因为当 /index 传递到 /index.php 时,任何适用于 /index.php 的规则都将被触发
以下是不太雅观的拼凑物:
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/index$
RewriteRule .* /index.php?rw=1 [L,QSA]
RewriteCond %{REQUEST_URI} ^/index\.php$
RewriteCond %{QUERY_STRING} !rw=1 [NC]
RewriteRule .* - [F]
(现在任何人都可以访问“/index.php?rw=1” - 它不如脚本编辑那么优雅)