Apache .htaccess重定向除文件和目录之外的所有URL

时间:2015-04-20 21:52:28

标签: apache .htaccess redirect

我正在开发一个目前位于子域的网站。在.htaccess文件中,我有以下内容:

RewriteEngine on
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l

RewriteRule ^([a-zA-Z_\-]+)/?$ /index.php?url=$1 [L,NC]
RewriteRule ^([a-zA-Z_\-]+)/(.+)/?$ /index.php?url=$1&$2 [L,NC]

当我尝试加载现有的css文件时,例如http://subdomain/path/to/existing/file.css Apache仍将其重定向到index.php。除现有文件和目录外,是否可以将所有URL重定向到index.php?

1 个答案:

答案 0 :(得分:3)

您的代码存在的问题是最后一条规则没有条件限制,因为每个条件或条件只能有一个RewriteRule

有可能更好的方法(可能使用跳过标记S),但您可以在此期间重复您的条件。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l

RewriteRule ^([a-z_-]+)/?$ index.php?url=$1 [L,NC]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l

RewriteRule ^([a-z_-]+)/(.+)/?$ index.php?url=$1&$2 [L,NC]

此外,由于您已指定NC标志,因此无需在模式中指定A-Z。此外,无需转义连字符-

更新:您还可以尝试按this answer设置环境变量:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l

# If the conditions above are true, then set a variable to say so
# and continue. 
RewriteRule ^ - [E=TRUE:YES]

RewriteCond %{ENV:TRUE} = YES
RewriteRule ^([a-zA-Z_\-]+)/?$ /index.php?url=$1 [L,NC]

RewriteCond %{ENV:TRUE} = YES
RewriteRule ^([a-zA-Z_\-]+)/(.+)/?$ /index.php?url=$1&$2 [L,NC]