即使有文件,htaccess也会重定向

时间:2011-09-03 16:44:02

标签: .htaccess

我的htaccess文件是:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI}  .*
RewriteCond %{QUERY_STRING} .* [NC]
RewriteRule .*\.php cms/index.php?request=$0&%{QUERY_STRING} [L]
RewriteRule ^(?:(?!website).).*\.(?:(?!php).)+$ cms/website/$0 [L]
RewriteRule ^[^./]*(\/[^./]*)*$ cms/index.php?dirs=$0 [L]

例如,uploads / aa.png中有一个文件,如果我请求http://example.com/uploads/aa.png,它仍会重定向http://example.com/website/uploads/aa.png

很快,如果网址上有文件请求它仍然重定向“cms / website”,我怎么能禁用它?

2 个答案:

答案 0 :(得分:3)

RewriteCond指令仅适用于下一个RewriteRule。 (只有一个。)

因此,您的重写条件仅适用于您的第一个RewriteRule。其他重写规则是无条件的。

你必须为每个RewriteRule重复RewriteCond,或者设置一个环境变量:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .? - [E=FILE_EXISTS:1]

RewriteCond %{ENV:FILE_EXISTS] !=1
RewriteRule .*\.php cms/index.php?request=$0&%{QUERY_STRING} [L]

RewriteCond %{ENV:FILE_EXISTS] !=1
RewriteRule ^(?:(?!website).).*\.(?:(?!php).)+$ cms/website/$0 [L]

RewriteCond %{ENV:FILE_EXISTS] !=1
RewriteRule ^[^./]*(\/[^./]*)*$ cms/index.php?dirs=$0 [L]

答案 1 :(得分:1)

1。拥有这些专栏有什么意义?

RewriteCond %{REQUEST_URI}  .*
RewriteCond %{QUERY_STRING} .* [NC]

除了浪费CPU周期外,它们什么都不做。

2. 你已经从@ arnaud576875得到了很好的答案。这是另一种可能更好(或可能不适合您的需求)的方法 - 它实际上取决于您的整体重写逻辑:

Options +FollowSymLinks -MultiViews
RewriteEngine On
RewriteBase /

# do not do anything for already existing files
# (no need to check for this condition again for other rules)
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule .+ - [L]

# your rewrite rules -- they work with non-existed files and folders only
RewriteRule .*\.php cms/index.php?request=$0 [QSA,L]
RewriteRule ^(?:(?!website).).*\.(?:(?!php).)+$ cms/website/$0 [L]
RewriteRule ^[^./]*(\/[^./]*)*$ cms/index.php?dirs=$0 [L]

备注:

  1. 我在第一次重写规则中删除了&%{QUERY_STRING} - QSA标记也是如此,甚至更好。

  2. 您在第一次重写规则中的匹配模式:.*\.php - 这不是很好,因为它也匹配/hello.php.png/tell-me-something。如果可以 - 那么没有probs,但是如果你只想将请求与.php文件匹配(例如/interesting/text.php),那么最好在结尾添加$:它到{ {1}}