我想删除.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
页?
答案 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');
}