链接 Duplicity 和 mod_rewrite

链接 Duplicity 和 mod_rewrite

我正在运行 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]
  1. 如果请求的 URI 不是有效文件则匹配。
  2. 如果请求的 URI 不是有效目录则匹配。
  3. 如果请求的 URI 加上“任意单个字符”加上“php”则匹配 一个有效的 PHP 文件(请注意,这将与“index.php”一样匹配“index-php” - 如果您想要文字匹配,则应该转义句点字符)。
  4. 将请求传递到“请求字符串是什么”(^(.*)$)加上“.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” - 它不如脚本编辑那么优雅)

相关内容