HTACCESS:删除扩展名,如果原始扩展名则返回404,但如果具有查询字符串则返回代码

时间:2018-07-03 11:28:04

标签: .htaccess

.htaccess

# Remove .php extension
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*?)/?$ $1.php [L]

# Return 404 if original request is .php
RewriteCond %{THE_REQUEST} "^[^ ]* .*?\.php[? ].*$"
RewriteRule .* - [L,R=404]

这可以正常工作,但是如何修改代码以使基于this code的语言切换有效?

当前它正在执行以下操作:

localhost/index = OK
localhost/index.php = OK (404 error)

但是当您按下按钮时

<a href="?la=en">EN</a>

它将如下更改地址

localhost/index => localhost/index.php?la=en = FAIL (404 page)

也会引发404错误。有可能预防吗?是否只会阻止在查询字符串之前添加.php?我希望语言切换也能正常工作,可以吗?有什么想法吗?

语言开关:

<?php
session_start();
if($_GET['la']){
    $_SESSION['la'] = $_GET['la'];
    header('Location:'.$_SERVER['PHP_SELF']);
    exit();
}

switch($_SESSION['la']){
     case "eng":
        require('lang/eng.php');
    break;
    case "fre":
        require('lang/fre.php');
    break;
    case "ger":
        require('lang/ger.php');
    break;
    default:
        require('lang/eng.php');
    }
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title><?php echo $lang['index-title'];?></title>
<link href="style/style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="wrapper">
    <div id="langSelect">
        <a href="index.php?la=eng"><img src="flags/eng.png" alt="<?=$lang['lang-eng'];?>" title="<?=$lang['lang-eng'];?>" /></a>
        <a href="index.php?la=fre"><img src="flags/fra.png" alt="<?=$lang['lang-fre'];?>" title="<?=$lang['lang-fre'];?>" /></a>
        <a href="index.php?la=ger"><img src="flags/ger.png" alt="<?=$lang['lang-ger'];?>" title="<?=$lang['lang-ger'];?>" /></a>
    </div>
    <div id="cont">
        <p><?=$lang['index-welcome'];?></p>
        <p><?=$lang['index-text-1'];?></p>
    </div>
</div>
</body>
</html>

已解决!

替换:

header('Location:'.$_SERVER['PHP_SELF']);

使用:

header('Location:'. str_replace(".php", "", $_SERVER['PHP_SELF']));

1 个答案:

答案 0 :(得分:2)

问题出在:header('Location:'.$_SERVER['PHP_SELF']);

  

$ _ SERVER [“ PHP_SELF”]是一个超级全局变量,它返回   当前正在执行的脚本的文件名。

将其更改为:

header('Location:'. str_replace(".php", "", $_SERVER['PHP_SELF']));

从字符串中删除扩展名。 希望对您有所帮助。