我要实现
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
答案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]