我正在开发一个目前位于子域的网站。在.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?
答案 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]