从www重定向到非www无法正常工作

时间:2017-01-09 23:21:32

标签: php apache .htaccess redirect vhosts

我在Craft CMS上运行了一个站点,我不确定该问题是否与CMS或服务器直接相关。

我正在使用.htaccess将任何www网址重写为非www版

<IfModule mod_rewrite.c>

    # (1)
    RewriteEngine On

    # (2)
    Options +FollowSymlinks

    # (3)
    #Options +SymLinksIfOwnerMatch

    # (4)
    #RewriteBase /

    # (5)
    #RewriteOptions <options>

    # (6)
    RewriteCond %{HTTPS} =on
    RewriteRule ^ - [env=proto:https]
    RewriteCond %{HTTPS} !=on
    RewriteRule ^ - [env=proto:http]


    # Send would-be 404 requests to Craft
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} !^/(favicon\.ico|apple-touch-icon.*\.png)$ [NC]
    RewriteRule (.+) index.php?p=$1 [QSA,L]

</IfModule>

<IfModule mod_rewrite.c>
    RewriteEngine On
#   RewriteCond %{HTTPS} !=on
    RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
    RewriteRule ^ %{ENV:PROTO}://%1%{REQUEST_URI} [R=301,L]
</IfModule>

当我输入domain.com/about时,它可以正常工作,但是当我输入www.domain.com/about时,它会将网址更改为domain.com/index.php?p=about

在Craft配置中,我启用了'omitScriptNameInUrls' => true,,以及下面的内容应该从URL中删除index.php。

RewriteEngine On

# Send would-be 404 requests to Craft
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/(favicon\.ico|apple-touch-icon.*\.png)$ [NC]
RewriteRule (.+) index.php?p=$1 [QSA,L]

这是vhost文件。

<VirtualHost *:80>
    ServerName domain.com
    ServerAdmin webmaster@domain.com
    DocumentRoot /var/www/

    <Directory /var/www/>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        allow from all
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

我查看了https://httpd.apache.org/docs/2.4/rewrite/remapping.html#canonicalhost,但没有任何改变运气。

我使用的是Ubuntu 16.04.1,Apache 2.4.18和7.0.8-0ubuntu0.16.04.3 在Ubuntu上主持。

我有什么可以测试的,看看我是否可以将www重定向到非www工作正常吗?

2 个答案:

答案 0 :(得分:1)

您需要在其他表达式之前移动此块:

<IfModule mod_rewrite.c>
    RewriteEngine On
#   RewriteCond %{HTTPS} !=on
    RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
    RewriteRule ^ %{ENV:PROTO}://%1%{REQUEST_URI} [R=301,L]
</IfModule>

虽然前一个版本中有L标记,但它应该是应用的最后一个规则,但它不起作用(可能是因为您稍后再次激活RewriteEngine以便重置规则,但是如果L标记在第一条规则中处于有效状态,则无论如何都不会应用www标记。

经验法则是:首先对域进行修饰,然后应用功能规则。

您也不需要打开2 IfModule条件。将二合一组合为:

<IfModule mod_rewrite.c>

    # (1)
    RewriteEngine On

    # (2)
    Options +FollowSymlinks

    # (3)
    #Options +SymLinksIfOwnerMatch

    # (4)
    #RewriteBase /

    # (5)
    #RewriteOptions <options>

    # (6)
    RewriteCond %{HTTPS} =on
    RewriteRule ^ - [env=proto:https]
    RewriteCond %{HTTPS} !=on
    RewriteRule ^ - [env=proto:http]

#   RewriteCond %{HTTPS} !=on
    RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
    RewriteRule ^ %{ENV:PROTO}://%1%{REQUEST_URI} [R=301,L]

    # Send would-be 404 requests to Craft
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} !^/(favicon\.ico|apple-touch-icon.*\.png)$ [NC]
    RewriteRule (.+) index.php?p=$1 [QSA,L]

</IfModule>

答案 1 :(得分:0)

强迫它!

RewriteCond %{HTTP_HOST} ^domain\.com [NC]
RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ http://domain.com/$1 [R,L]