我的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”,我怎么能禁用它?
答案 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]
备注:强>
我在第一次重写规则中删除了&%{QUERY_STRING}
- QSA
标记也是如此,甚至更好。
您在第一次重写规则中的匹配模式:.*\.php
- 这不是很好,因为它也匹配/hello.php.png/tell-me-something
。如果可以 - 那么没有probs,但是如果你只想将请求与.php文件匹配(例如/interesting/text.php
),那么最好在结尾添加$
:它到{ {1}}