PHP-将HTTPS重定向到http,并将www重定向到非www

时间:2017-11-20 作者:Kyle Vassella

**编辑:我终于弄明白了。向下滚动我的自我回答自我接受答案(绿色复选标记)**

我当前正在使用functions.php 重定向https URL到http 对于当前没有SSL证书的站点:

function shapeSpace_check_https() { 
if ((!empty($_SERVER[\'HTTPS\']) && $_SERVER[\'HTTPS\'] !== \'off\') || $_SERVER[\'SERVER_PORT\'] == 443) {
    
    return true; 
}
    return false;
}


function bhww_ssl_template_redirect() {
if ( shapeSpace_check_https() ) {

    if ( 0 === strpos( $_SERVER[\'REQUEST_URI\'], \'http\' ) ) {
    
        wp_redirect( preg_replace( \'|^https://|\', \'http://\', $_SERVER[\'REQUEST_URI\'] ), 301 );
        exit();
    } else {
            wp_redirect( \'http://\' . $_SERVER[\'HTTP_HOST\'] . 
$_SERVER[\'REQUEST_URI\'], 301 );
            exit(); 
        }
    
    }

}

add_action( \'template_redirect\', \'bhww_ssl_template_redirect\');
在这个函数中,我还想重定向www 子域到非www。我发现了一个很好的函数here, 但需要帮助将其实现到我当前的功能中。我想避免在.htaccess, 但我也欢迎有一个解决方案。

4 个回复
最合适的回答,由SO网友:Kyle Vassella 整理而成

谢谢大家的帮助。但下面的代码最终对我起到了301重定向的作用httpshttpwww 我将以下代码块放置在functions.php:

//check if https being used regardless of certificate
function shapeSpace_check_https() { 
    if ((!empty($_SERVER[\'HTTPS\']) && $_SERVER[\'HTTPS\'] !== \'off\') || $_SERVER[\'SERVER_PORT\'] == 443) {
        return true; 
    }
    return false;
}


for ($x=0; $x<1; $x++) {
    //if https:// && www.
    if ( shapeSpace_check_https() && substr($_SERVER[\'HTTP_HOST\'], 0, 4) === \'www.\'){
            header(\'HTTP/1.1 301 Moved Permanently\');
            header(\'Location: http://\' . substr($_SERVER[\'HTTP_HOST\'], 4).$_SERVER[\'REQUEST_URI\']);
            exit;
            break;
    //if only www.
    } elseif (substr($_SERVER[\'HTTP_HOST\'], 0, 4) === \'www.\') {
            header(\'HTTP/1.1 301 Moved Permanently\');
            header(\'Location: http://\' . substr($_SERVER[\'HTTP_HOST\'], 4).$_SERVER[\'REQUEST_URI\']);
            exit;
            break;
    //if only https://
    } elseif ( shapeSpace_check_https() ) {
            header(\'HTTP/1.1 301 Moved Permanently\');
            header(\'Location: http://\' . $_SERVER[\'HTTP_HOST\'].$_SERVER[\'REQUEST_URI\']);
            exit;
            break;
    }
}
我想我不需要break;\'s、 但我绝对需要exit;\'s和我离开了break;\'以防万一。请随时告诉我为什么我可能不需要两者兼而有之。上述代码导致以下重定向:

https://www.example.comhttp://example.com

https://example.comhttp://example.com

http://www.example.comhttp://example.com

SO网友:Fayaz

如何重定向HTTPSHTTPwwwnon-www URL与.htaccess:

首先确保HTTPS 有效且有效。这很容易(而且是免费的)Let\'s Encrypt 这些天。

Note:虽然您正在重定向HTTPSHTTP, 我建议做相反的事情,即。HTTPHTTPS. 更好的安全性、搜索引擎优化和;浏览器兼容性—流行的浏览器越来越难以HTTP 网站。

然后确保.htaccessmod_rewrite 模块正在工作。

然后在.htaccess web根目录的文件(如果您已经在那里使用了一些规则,请使用这些新规则相应地进行调整):

<IfModule mod_rewrite.c>
    RewriteEngine On

    RewriteCond %{HTTPS}        =on   [OR]
    RewriteCond %{HTTP_HOST}    !^example\\.com$
    RewriteRule ^(.*)$          "http://example.com/$1" [R=301,L]

    # remaining htaccess mod_rewrite CODE for WordPress
</IfModule>
Note:替换example.com 使用您自己的域名。

为什么.htaccess 解决方案更好:最好使用web服务器进行此类重定向。根据您的问题,因为您的web服务器Apache, 最好是.htaccess. 原因:

速度更快functions.php 文件保持干净(&P);做它原来的用途,即修改主题

SO网友:Drupalizeme

从您的代码中提取,我将如下重构:

function bhww_ssl_template_redirect() {
    $redirect_url=\'\';
    if ( shapeSpace_check_https() ) {
        if ( 0 === strpos( $_SERVER[\'REQUEST_URI\'], \'http\' ) ) {
            $url = $_SERVER[\'REQUEST_URI\'];

            $not_allowed = array(\'https://www\', \'https://\');
            foreach($not_allowed as $types) {
                if(strpos($url, $types) === 0) {
                    $redirect_url = str_replace($types, \'http://\', $url); 
                } 
            }
        } else {
            $redirect_url =\'http://\' . $_SERVER[\'HTTP_HOST\'] .  $_SERVER[\'REQUEST_URI\'];
        }

            $redirect_url = !empty($redirect_url)?$redirect_url:$url;
            wp_redirect($redirect_url, 301 );
            exit(); 
    }
}
将其添加到.htaccess 重定向www->非www的规则

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.yourdomain.com [NC]
RewriteRule ^(.*)$ http://yourdomain.com/$1 [L,R=301]
重定向https->http

RewriteEngine On
RewriteCond %{HTTPS} on
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI}
但要使其工作,您需要有一个有效的SSL,否则将向用户显示“恐怖屏幕”。

SO网友:Sid

在此,使用此更新的功能将www站点重定向到非www:

function bhww_ssl_template_redirect() {
    $redirect_url=\'\';
    $url = $_SERVER[\'REQUEST_URI\'];
    if ( shapeSpace_check_https() ) {
        if ( 0 === strpos( $url, \'http\' ) ) {
            if(strpos($url, \'https://\') === 0) {
                $redirect_url = str_replace(\'https://\', \'http://\', $url); 
            } 
        } 
        elseif ( TRUE == strpos( $url, \'www.\') {
             $redirect_url = str_replace(\'www.\', \'\', $url); 
        } 
        else {
            $redirect_url =\'http://\' . $_SERVER[\'HTTP_HOST\'] .  $_SERVER[\'REQUEST_URI\'];
        }
            $redirect_url = !empty($redirect_url)?$redirect_url:$url;
            wp_redirect($redirect_url, 301 );
            exit(); 
    }
}
如果有帮助,请告诉我。

结束

相关推荐

如何在WordPress网站上运行非WordPress PHP程序?

我有一个类似的问题this one: 我创建了一个小PHP程序,我想将其作为rest web服务调用,以从自定义MySQL表返回一些数据。我可以把它放在任何地方,但我尝试了根文件夹(public\\u html),一个我创建的名为custom的文件夹,以及cgi-bin文件夹。对于前两个,我得到404找不到。对于CGI-BIN,它看起来像是重定向到我的主页。我已将CHMOD设置为755(以及自定义文件夹)。我的htaccess如下所示。我想也许需要改变一下?# BEGIN WordPress &l