mod_rewrite 和尾部斜杠

mod_rewrite 和尾部斜杠

我要实现

www.example.com/test/ rewrite to www.example.com/example.com/test/  
www.example.com/ rewrite to www.example.com/example.com/  

我可以使用这个重写配置来做到这一点:

RewriteCond %{HTTP_HOST} ^(www\.)?example.com$  
RewriteCond %{REQUEST_URI} !^/example.com(.*)  
RewriteCond %{REQUEST_URI} ^(.*)/$  
RewriteRule ^(.*) /example.com/$1  [L]  

但我也想重定向相同的内容而不使用尾部斜杠:

www.example.com/test redirect to www.example.com/example.com/test/  
www.example.com/ redirect to www.example.com/example.com/  

我曾尝试过这个:

RewriteCond %{HTTP_HOST} ^(www\.)?example.com$
RewriteCond %{REQUEST_URI} !^/example.com(.*)
RewriteCond %{REQUEST_URI} !^(.*)/$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*[^/])$ $1/ [R=301,L]

但不起作用,它会重定向到:

IE: http://www.example.com/C:/wamp/www/test/
Firefox: http://www.example.com/C:/wamp/www/example.com/test/

您知道这个问题的解决方案吗(无需触及 mod-dir conf)?

答案1

我找到了解决方案:

Options +FollowSymLinks
RewriteEngine On

# Fix missing trailing slashes.
RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
RewriteCond %{DOCUMENT_ROOT}/_l_/example\.com%{REQUEST_URI}/ -d
RewriteRule [^/]$ %{REQUEST_URI}/ [R=301,L]

# Rewrite sub domains.
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
RewriteRule ^(.*)$ /_l_/example\.com/$1 [QSA,L]

谢谢您的回答。

答案2

尝试

RewriteCond C:/wamp/www%{REQUEST_FILENAME} !-f

或者

RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f

也可以看看“mod_rewrite 中的 REQUEST_FILENAME 有什么问题?”

答案3

我不知道您的浏览器中的“C:”来自哪里 - 更有用的诊断方法是从 HTTP 响应中找到“Location”标头 - 使用 Firebug、LiveHTTPHeaders 或 telnet 之类的工具来获取它。

此外,鉴于您的第二个 RewriteRule 根本没有提到“example.com”,我猜测您的 httpd.conf 中同时拥有两个 RewriteRule。

如果是这种情况,那么第一条规则末尾的 [L] 修饰符将完全阻止第二条规则的执行。

答案4

为什么不直接用这个呢?

RewriteCond %{HTTP_HOST} ^(www\.)?example.com$  
RewriteCond %{REQUEST_URI} !^/example.com(.*)  
RewriteRule ^(.*) /example.com/$1  [L]

相关内容