.htaccess在强制www时隐藏扩展名

时间:2011-05-13 18:45:35

标签: apache .htaccess url redirect

我有以下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?

2 个答案:

答案 0 :(得分:2)

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

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>

我已经测试过了,并且在我的最后工作正常。

答案 1 :(得分:1)

在这种情况下,什么是“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>