奇怪的.htaccess重定向行为

时间:2018-01-31 16:50:45

标签: php .htaccess

我有一个具有以下文件夹结构的PHP项目:

  • 的.htaccess
  • 控制器
  • 模型
  • util的
  • 视图
      • 的.htaccess
      • 的index.php
      • 的login.php
      • project.php
      • passwordredefinition.php
      • test123abc123abc.php
      • 的login.php

我的目标是让用户输入网址" localhost / login"或" localhost / passwordredefinition"它们将分别重定向到login和passwordredefinition。

为了实现这个目标,我的根.htaccess文件是这样的:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=/$1 [QSA,L]
RewriteCond %{REQUEST_FILENAME} !f
RewriteCond %{REQUEST_FILENAME} \.php$
RewriteRule ^(.*)$ index.php?url=/$1 [QSA,L]

我的view / pages / .htaccess文件是这样的:

echo "I have been here" // tests purposes
//long script for file inclusions based on the GET parameter

我的view / pages / index.php文件是这样的:

localhost/login

如果请求是"经过" index.php,我知道因为"我来过这里"在页面顶部。

这工作得很好。 localhost/project有效且passwordredefinition.php有效。但后来我创建了localhost/passwordredefinition文件。当网址与此index.php类似时,它不会通过test123abc123abc.php文件,但如果我只是将文件重命名为localhost/test123abc123abc,我会尝试.PRECIOUS它工作得很好。

我使用了很多文件名来测试它,对我来说,这种行为几乎是随机的。

那么,我做错了什么?请记住,我是使用.htaccess的新手

2 个答案:

答案 0 :(得分:0)

RewriteCond %{REQUEST_FILENAME} !-f此部分表示如果文件存在不重定向,如果您创建test.php并致电localhost/test.php,则如果您致电index.php则不会localhost/test2.php它会因为它不存在而

在你的情况下:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]

表示如果文件不存在,则重定向到[path].php localhost/passwordredefinition重写为localhost/passwordredefinition.php

要对此进行测试,您可以创建不带扩展名的passwordredefinition文件名,并在其中添加一些文字。 新行为应该:

  • localhost/passwordredefinition转到新文本文件
  • localhost/passwordredefinition.php转到php文件

答案 1 :(得分:0)

请记住.htaccess在根级别配置为仅响应某个文件夹深度。三个文件夹深度应该运行正常,但也考虑到父文件夹中的.htaccess文件仍将影响其下的文件夹中的文件。

我建议废弃整个游戏计划并将其替换为重定向PHP脚本,类似于Wordpress所做的。

重定向用户的所有逻辑都可以在PHP代码中控制,这将为您提供更大的控制 - 特别是如果您打算验证用户。

<强> htaccess的:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /redirect.php [L]
</IfModule>

<强> redirect.php:

<?php
function slug_it($in,$folders = true) {
 if (strpos($in,'?')) list($in,$q) = explode('?',$in,2);
 if (strpos($in,'#')) list($in,$q) = explode('#',$in,2);
 $in = preg_replace('/[^a-zA-Z0-9\-\_'.($folders ? '\/' : '').']/','_',$in);
 if ($folders) $in = preg_replace('/[\/]+/','/',$in);
 $in = preg_replace('/[_]+/','_',$in);
 if ($folders) $in = trim($in,'/');
 $in = trim($in,'-');

 return $in;
}

$rewrites = array(
 'login' => 'localhost/login.php',
 'passwordredefinition' => 'localhost/view/pages/passwordredefinition.php',
);

$file = slug_it($_SERVER['REQUEST_URI']);

if (isset($rewrites[$file])) {
 include($rewrites[$file]);
 exit();
}

include('path_to_404_error_page');