2011-09-03 92 views
1

我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] 

例如有在上传/ aa.png一个文件,如果我要求http://example.com/uploads/aa.png,它仍然重定向http://example.com/website/uploads/aa.png

不久,如果在请求的url上有文件,它仍然会重定向“cms/website”,我该如何禁用它?

回答

3

RewriteCond指令只适用于下一个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] 
+0

我不不知道为什么,但它不起作用。然而我赞同这个想法,并再次编辑我的htaccess文件。 http://pastebin.com/nw9xxV4K谢谢! –

1

什么是有这些线的点?

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

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

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

注:

  1. 我已经摆脱了&%{QUERY_STRING}在第一次重写规则 - QSA标志不变,甚至更好。

  2. 您在第一个重写规则中的匹配模式:.*\.php - 这不是很好,因为它也不会匹配/hello.php.png/tell-me-something。如果这是确定的 - 没有probs然后,但如果你想只匹配请求.php文件(如/interesting/text.php),那么这将是更好地在末尾添加$:它.*\.php$

+0

感谢您的回答。你的所有观点都很棒,我不太清楚htaccess,我看了一下htaccess文件并写下了这几行。但是我无法理解这一行“RewriteRule。+ - [L]”,并且是否有mod.rewrite的任何文档,我找不到任何东西? –

+0

你究竟有什么不明白的地方?该规则(带条件)通常表示为:“如果请求的资源是文件或文件夹,则重写为相同的URL,这意味着现在退出重写”。 '。+'表示至少一个字符;目标URL地址中的'-'表示“什么都不做”/“重写到同一个URL”,'[L]'表示“本次迭代中的最后一条规则”。有用的链接:http://stackoverflow.com/questions/6797998/rewriterule-last-l-flag-not-working。 – LazyOne