用于重定向所有非目录和非文件请求的htaccess规则


htaccess rule for redirect of all non-directory and non-file requests

我有一个站点,我需要一个catch-all来处理非目录和非文件请求,以便重新定向回HTTP_HOST。我有一个重写规则,只提供无扩展名的PHP文件,并且总是从裸域请求中解析到www.HTTP_HOST。这是我的htaccess文件:

#Main Page
DirectoryIndex index.php
AddDefaultCharset UTF-8
Options +FollowSymLinks
RewriteEngine On
RewriteBase /
# Cache Control for Images and Assets
<FilesMatch "'.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$">
Header set Cache-Control "max-age=604800, public"
</FilesMatch>
# Never Use the naked domain
RewriteCond %{HTTP_HOST} ^example'.com$ [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [L,R=301,NE]
# Never Use the naked domain and Remove PHP extension
RewriteCond %{THE_REQUEST} '.(php|cfm)['s?] [NC]
RewriteCond %{DOCUMENT_ROOT}/$1'.php -f
RewriteRule ^(.+?)'.(cfm|php)$ /$1 [R=301,L,NE]
# Re-direct Non-file Non-directories to HTTP_HOST
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+?)(('?.*)|())$ http://www.example.com [R=301,L]
# unless directory, remove trailing slash
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [R=301,L]
# Resolve .php file for extensionless php urls
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/$1'.php -f
RewriteRule ^(.+?)/?$ $1.php [L] 

我的第四条规则似乎没有按我需要的方式运行,不知道为什么。感谢您提前提供的帮助。

不要使用mod_rewrite进行非文件请求过滤,而是考虑使用FallbackResource:

http://httpd.apache.org/docs/trunk/mod/mod_dir.html#fallbackresource

这更容易维护,Apache也应该更容易处理。