【问题标题】:HTACCES mod rewrite, stacking rulesHTACCESS mod 重写,堆叠规则
【发布时间】:2012-10-29 16:41:23
【问题描述】:

我们有一个如下所示的重写规则:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule (?!^(cms|images|js|mobile)(/.*|)$)^.*$ page.php [NC,L]

按预期工作;如果该文件不存在,则转发到 page.php,这是一个通用页面,允许使用自定义 URL 的页面。

我们还想强制使用 www。在域之前:example.com -> www.example.com

为此,我们使用:

RewriteCond %{HTTP_HOST} ^example.com$
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]

这也有效,但是当两者应该一起工作时:

example.com/non-existent-file

我们最终得到:

www.example.bom/page.php

默认为我们的 404 页面。如何修改这些规则以协同工作?我尝试过使用一些不同的 suffic 字符(即删除 [NC,L] 中的 L 以尝试处理这两个规则)。

我还尝试在 www 重定向下方重复转发到 page.php 行(并删除 L 后缀),但没有成功。

整个 HTACCESS 文件如下所示:

Options +FollowSymLinks
RewriteEngine On
RewriteBase   /

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule (?!^(cms|images|js|mobile)(/.*|)$)^.*$ page.php [NC,L]

RewriteCond %{HTTP_HOST} ^example.com$
RewriteRule ^(.*)$ http://www.example.com/$1 [R=302,L]

另外,我可以使用 %{CONSTANT} 来代替代表当前域的 example.com 吗?

【问题讨论】:

    标签: .htaccess mod-rewrite


    【解决方案1】:

    您要查找的常量 %{HTTP_HOST},由 HTTP 请求提供。也许您正在为虚拟主机的默认服务器名寻找变量%{SERVER_NAME}

    首先放置主机名检查规则,并在page.php 规则中使用RewriteCond 以仅在域已经正确时应用:

    RewriteEngine On
    # First rewrite the domain
    RewriteCond %{HTTP_HOST} ^example\.com$
    RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
    
    # Then rewrite the files
    # At this point, the domain should already have been enforced
    RewriteCond %{HTTP_HOST} ^www\.example\.com$
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-l
    RewriteRule (?!^(cms|images|js|mobile)(/.*|)$)^.*$ page.php [NC,L]
    

    【讨论】:

      猜你喜欢
      • 2015-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-13
      • 2012-05-13
      相关资源
      最近更新 更多