我的目标是指出:
http://xyz.domain.com/abc
至http://www.domain.com/dir/file.php?var=xyz
(换句话说,http://_____.domain.com/abc
的任何内容都会从http://www.domain.com/dir/file.php?var=_____
读取。)
我在网站根目录(http://www.domain.com/.htaccess)的.htaccess文件中使用了这个:
RewriteCond %{HTTP_HOST} !^www.domain.com [NC]
RewriteCond %{HTTP_HOST} ^(www.)?([a-z0-9-]+).domain.com [NC]
RewriteRule ^abc/*$ dir/file.php?var=%2 [NC,L]
虽然有效,但当我只是想http://xyz.domain.com/abc/?var=xyz
而没有显示查询字符串时,它会自动重定向到http://xyz.domain.com/abc
。
我考虑在上面添加%{QUERY_STRING}
行,但在尝试将两个RewriteCond的var
彼此匹配时卡住了。
然后我在http://www.askapache.com/htaccess/modrewrite-tips-tricks.html#Removing_Query_String
找到了这个RewriteCond %{THE_REQUEST} ^GET\ /.*\;.*\ HTTP/
RewriteCond %{QUERY_STRING} !^$
RewriteRule .* http://www.askapache.com%{REQUEST_URI}? [R=301,L]
...我猜这是正确的代码在常规域上摆脱这样的东西?我尝试将其更改为适用于通配符子域:
RewriteCond %{THE_REQUEST} ^GET\ /.*\;.*\ HTTP/
RewriteCond %{QUERY_STRING} !^$
RewriteCond %{HTTP_HOST} !^www.domain.com [NC]
RewriteCond %{HTTP_HOST} ^(www.)?([a-z0-9-]+).domain.com[NC]
RewriteRule .* http://%2.domain.com%{REQUEST_URI}? [R=301,L]
但它不起作用。所以...有人可以帮忙吗?
答案 0 :(得分:0)
有一个名为mod_dir的模块,当它认为您正在尝试访问目录但缺少尾部斜杠时,会重定向浏览器。当我在我的apache上测试它只发生在目录实际存在时,我被重定向到一个尾部斜杠,但是重写发生了,我看到了查询字符串。在内部尝试强制使用尾部斜杠,当重写为dir / file时,明确使用尾部斜杠:
# Force trailing slash when accessing /abc without one
RewriteRule ^abc$ /abc/ [NC,L]
# these are the same
RewriteCond %{HTTP_HOST} !^www.domain.com [NC]
RewriteCond %{HTTP_HOST} ^(www.)?([a-z0-9-]+).domain.com [NC]
# Match against a trailing slash
RewriteRule ^abc/$ dir/file.php?var=%2 [NC,L]