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