重写URL以不包含文件扩展名

时间:2009-08-17 08:48:39

标签: .htaccess mod-rewrite url-rewriting

这是一个反复出现的问题。对此有类似的问题,但没有什么能回答我的问题。

我有一个网站,我希望每个网页只能在一个网址上使用。它应该在所有页面上动态工作,而不是在一个严格的硬编码文件名上。

  1. domain.tld/foo应重定向到domain.tld/foo/
  2. domain.tld/foo.php应重定向到domain.tld/foo/
  3. domain.tld/foo/应该向用户提供(但不会将其重定向到)domain.tld/foo.php
  4. 1和3并不太难,但是如果不引入循环引用并且没有太多的重定向,我就无法弄清楚2。我怎么能这样做?

3 个答案:

答案 0 :(得分:2)

尝试以下三条规则:

RewriteCond %{THE_REQUEST} ^GET\s/[^?\s]+\.php[?\s]
RewriteRule (.+)\.php$ /$1/ [L,R=301]
RewriteCond $0 !.+\.php$
RewriteRule (.*[^/])$ /$1/ [L,R=301]
RewriteRule (.+)/$ $1.php [L]

要排除任何其他现有文件,请将此规则放在其他文件的前面:

RewriteCond %{REQUEST_FILENAME} -f
RewriteRule !.+\.php$ - [L]

答案 1 :(得分:1)

重写#1由

处理
DirectorySlash on

无论如何都应该是默认值。

对于#2和#3:

RewriteRule /(.+).php /$1/ [R=301,L]
RewriteRule /(.+)/ /$1.php

答案 2 :(得分:0)

如果我的理解正确,那么您的问题与我在此处发布问题时所遇到的问题类似How can I detect if page was requested via a redirect?

虽然我们找不到完全解决问题的答案,但仍有一些回复可能会对您有所帮助。