htaccess-隐藏多个扩展名

时间:2018-08-20 07:52:16

标签: php .htaccess

我想删除.html文件中的.php.htaccess扩展名。我希望用户能够通过单击 www.example.com/page.php www查看 www.example.com/page.php 。 example.com/page ,但浏览器始终显示 www.example.com/page

尝试了一些我在网上找到的选项,而这个选项对我有用:

RewriteCond %{THE_REQUEST} /([^.]+)\.html [NC] 
RewriteRule ^ /%1 [NC,L,R] 
RewriteCond %{REQUEST_FILENAME}.html -f 
RewriteRule ^ %{REQUEST_URI}.html [NC,L] 
RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC] 
RewriteRule ^ /%1 [NC,L,R] 
RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule ^ %{REQUEST_URI}.php [NC,L]

我认为那很棒,我可以在上面提到的页面之间浏览。

但是,它随后尝试登录到我的任何页面均失败。输入凭据后,它将重新打开我所在的页面,而不会出现错误消息。

.php页的文件中有一个require("connection.php");,用于访问数据库。

然后像这样:

<?php
    require("connection.php"); 
    if(!empty($_POST)) 
    { 
        // check credentials
        // redirect to specific page
?>
<!DOCTYPE html>
<html>
<body>
    <form action="index.php" method="post">
    // the rest of the form
</body>
</html>

如果我注释掉.htaccess中的php重写,则登录将按预期工作。这不是数据库问题,因为我可以查看从那里显示数据的页面。

我的.htaccess文件中是否存在某些错误地重定向了我的.php页?

2 个答案:

答案 0 :(得分:1)

您可以使用:

#Without redirection with POST
RewriteCond %{REQUEST_METHOD} !POST
RewriteCond %{THE_REQUEST} (/[^.]+)\.(html|php) [NC] 
RewriteRule ^ %1 [L,R=301] 

RewriteCond %{REQUEST_FILENAME}.html -f 
RewriteRule ^ %{REQUEST_URI}.html [L] 
RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule ^ %{REQUEST_URI}.php [L]

答案 1 :(得分:0)

您是否尝试过通过一个文件路由所有请求?

通常,您要做的是将php或html文件的所有流量重新路由到主index.php文件,并加载所需的正确文件。

这样,您就有一条管道可以处理所有特殊情况,文件准备等。

htaccess

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . index.php [L]

非常简化的index.php

<?php
require_once('connection.php');
function render($file, $vars = []) 
{
    if(file_exists($file) {
        ob_start();
        extract($vars);
        include($file);
        return ob_get_clean();
    }
    return false;
}

function route($file) 
{
    $absolute = __DIR__ . $path;
    $extensions = ['.htm','.html','.php'];
    if(file_exists($absolute)) {
       return render($absolute);
    }
    else {
       foreach($extensions as $ext) {
           if(file_exists($absolute . $ext)) {
              return render($absolute .$ext);
           }
       }
    }
    return false;
}
$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
if($output = route($path)) {
   echo $output;
}
else {
   echo render(__DIR__.'/errors/404.html');
}