我有一个具有以下文件夹结构的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的新手
答案 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');