【问题标题】:Redirect Non-www to www URLs but it doesn't work well?将非 www 重定向到 www URL,但效果不佳?
【发布时间】:2013-12-16 01:58:00
【问题描述】:

我正在使用 .htaccess 代码来更改网址(在非 www 网址中添加“www.”),但我的问题是在 url 中输入 /subfolder 时,.htaccess 重定向无法正常工作。

示例

我输入这个网址:mydomain.com/demo/ 它重定向到:www.mydomain.com(没有/demo
有什么想法吗?

这是我的.htaccess 代码:

  RewriteEngine on
  RewriteCond %{HTTP_HOST} !^www\. [NC]
  RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

【问题讨论】:

  • 您的 www 根目录下的 .htaccess 文件位于何处,您的 RewriteBase 设置为什么?
  • 我的 .htaccess 文件在 /root/demo 文件夹中

标签: .htaccess redirect web no-www


【解决方案1】:

您的问题是,如果 .htaccess 文件放在 www 根文件夹的子文件夹中,那么子文件夹的名称是 stripped from the path before it's passed to the rewrite rules

"当在.htaccess 文件中使用重写引擎时,每个目录的前缀(对于特定目录总是相同的)会自动删除以进行 RewriteRule 模式匹配并自动在任何相对(不以斜杠或协议名称开头)替换遇到规则集的末尾后添加。有关将添加回相对替换的前缀的更多信息,请参阅RewriteBase 指令。” p>

因此,您的重写规则中的^(.*)$ 正则表达式应该 匹配整个路径并将其保存在$1 中,实际上只匹配路径的一部分 demo/ 前缀之后。

要解决此问题,您有两种选择:

  • a) 将您的 .htaccess 文件(或至少此特定的重写规则)移动到 www 根文件夹。如果您出于某种原因仍希望它仅匹配“演示”文件夹下的路径,请将 ^(.*)$ 正则表达式替换为例如^(demo(/.*)?)$

  • b) 自己添加文件夹名称,使您的重写规则如下所示:

重写引擎开启 RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/demo/$1 [R=301,L,NS]

(我还添加了NS flag,因为您可能希望它用于像这样的“化妆品”外部重写。)

【讨论】:

    【解决方案2】:

    试试这个代码添加www

    RewriteEngine On
    
    RewriteCond %{HTTP_HOST} ^mydomain\.com$ [NC]
    RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI}  [R=301,L,NE]
    

    【讨论】:

      【解决方案3】:
      RewriteCond %{HTTP_HOST} !^www\.
      RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
      

      【讨论】:

        【解决方案4】:

        我已更改该代码并将其放在根路径中,效果很好:

        <IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteBase /
        RewriteCond %{HTTP_HOST} ^mydomain\.com$ [NC]
        RewriteRule ^(.*)$ http://www.mydomain.com/$1 [R=301,L]    
        </IfModule>
        

        .htaccess 文件应该放在 /demo 文件夹中,但是当我将其位置移动到 /demo 文件夹时,我发现它无法很好地重定向。

        即:http://mydomain.com/demo/?querystring 重定向 => http://www.mydomain.com/?querystring

        问题是 url 中的 'demo/' 被消除了。

        你有什么想法吗?

        【讨论】:

        • 不要发布更多问题作为答案,答案有一个编辑按钮
        【解决方案5】:

        也许是这个?

        # 强制 www # 如果你有子域,你可以将它们添加到 # 使用“|”的列表(OR) 正则表达式运算符 RewriteCond %{HTTP_HOST} !^(www|local|admin) [NC] 重写规则 ^(.*)$ http://www.yourdomainhere.com/$1 [L,R=301]

        【讨论】:

        • 您好,先生,不,它不起作用!检查我的网站arcadebooster.org 我将您的 sn-p 代码放在“/demo”子文件夹中的 .htaccess 文件中,但它不再起作用了。
        • 但是你的主站点在 /demo 中,所以要么把主站点放到根目录,要么在 rewriteEngine 之后在 .htaccess RewriteBase /demo/ 的顶部再添加一行
        猜你喜欢
        • 2011-06-24
        • 2019-03-09
        • 2011-11-05
        • 2013-12-20
        • 1970-01-01
        • 2015-08-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多