【问题标题】:.htaccess hide extension while forcing www.htaccess 在强制 www 时隐藏扩展名
【发布时间】:2011-08-25 04:16:07
【问题描述】:

我有以下 htaccess 文件,它隐藏了 php 扩展名并强制所有 URL 使用 www:

<IfModule mod_rewrite.c>
   Options +FollowSymLinks
   Options +Indexes
   RewriteEngine On
   RewriteCond %{SCRIPT_FILENAME} !-d
   RewriteRule ^([^\.]+)$ $1.php [NC,L]
</IfModule>

RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

第一部分归功于this answer,第二部分归功于this answer

这在大多数情况下都很完美,但是有一个问题。当用户尝试访问http://example.com/foo(或者不是“foo”,其他任何页面)时,它会重定向到http://www.example.com/foo.php

我怎样才能让它重定向到http://www.example.com/foo,也就是说,没有.php?

【问题讨论】:

    标签: apache .htaccess url redirect


    【解决方案1】:

    您只需要更改规则的顺序。首先是外部重定向,然后是内部重定向。有这样的代码:

    RewriteCond %{HTTP_HOST} !^www\.
    RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
    
    <IfModule mod_rewrite.c>
       Options +FollowSymLinks
       Options +Indexes
       RewriteEngine On
       RewriteCond %{SCRIPT_FILENAME} !-d
       RewriteRule ^([^\.]+)$ $1.php [NC,L]
    </IfModule>
    

    我已经对其进行了测试并且工作正常。

    【讨论】:

      【解决方案2】:

      在这种情况下,什么是“foo”,一个文件?如果是这样,这有效:

      RewriteCond %{SCRIPT_FILENAME} !-f
      RewriteCond %{SCRIPT_FILENAME} !-d
      RewriteRule ^([^\.]+)$ $1.php [NC,L]
      

      如果你想专门排除“foo”,

      RewriteRule ^foo$ - [L]
      RewriteCond %{SCRIPT_FILENAME} !-f
      RewriteCond %{SCRIPT_FILENAME} !-d
      RewriteRule ^([^\.]+)$ $1.php [NC,L]
      

      如果您尝试使用 Web 框架,那么他们可能希望您将所有非文件和非目录请求重定向到 index.php 之类的内容。

      编辑:尝试交换和合并这两个部分:

      Options +FollowSymLinks
      Options +Indexes
      
      <IfModule rewrite_module>
        RewriteEngine On
        RewriteCond %{HTTP_HOST} !^www\.
        RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
        RewriteCond %{SCRIPT_FILENAME} !-f
        RewriteCond %{SCRIPT_FILENAME} !-d
        RewriteRule ^([^\.]+)$ $1.php [NC,L]
      </IfModule>
      

      【讨论】:

      • 抱歉,我的意思是使用“foo”作为generic 页面。我将编辑问题以使其更清楚。
      • 在这种情况下,我的答案的第一部分 (!-f) 就是你想要的。
      • 我将第一部分添加到我的 .htaccess 中,但它仍然在重定向时添加了 .php。
      • 您必须提供更具体的细节。你在服务器上创建了一个真实的文件?
      • 是的,服务器中有一个名为 foo.php 的文件。它在 www.example.com/foo 上运行良好,但如果我输入 example.com/foo(没有 www),它会重定向到 www.example.com/foo.php。 .php 部分不应该显示。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-24
      • 2017-05-13
      • 2011-07-28
      • 2014-03-29
      • 2013-03-13
      相关资源
      最近更新 更多