htaccess重写tld而不更改子域或死

时间:2011-03-23 13:04:40

标签: apache .htaccess

我正在尝试重写以下网址:

子域应匹配任何子域。同样适用于TLD。 两者:http://car.example.com/http://cat.example.co.uk都应该重写

http://subdomain.example.com/some/dirhttp://subdomain.example.nl/some/dir

http://example.com/some/dirhttp://exampkle.nl/some/dir

(也与www。地址一起)

但是我对htaccess和重写规则的了解一般都不够好:(

我希望你们中的一个人知道解决方案。

PS。我确实尝试过搜索;)

2 个答案:

答案 0 :(得分:3)

挑战在于必须检测并考虑四种不同的可能域模式:

  • example.com→example.nl
  • example.co.uk→example.nl
  • sub.example.com→sub.example.nl
  • sub.example.co.uk→sub.example.nl

所以,这个规则集的作用是检查TLD是不是.nl(防止发生循环),然后从前面拉出子域名www或者不读取子域名(读取为“捕获除点后面的任何内容”一个点,可选),然后是基本域,后跟一个点。我们不必匹配整个URL,因为我们没有保留TLD。

RewriteEngine On
RewriteCond %{HTTP_HOST} !example\.nl$
RewriteCond %{HTTP_HOST} ^([^.]+\.)?example\.
RewriteRule ^ http://%1example.nl%{REQUEST_URI} [NC,L,R=301]

RewriteRule ^匹配任何URL,然后在前面的RewriteCond(子域)中插入第一组parens的内容与%1,并通过附加请求的路径和标志来完成重写以忽略大小写,使其成为最后一条规则,并使用搜索引擎友好的301重定向,确保重写的URL出现在用户的浏览器中。默认情况下会自动包含任何查询字符串(出现在URL中的?后面的文本)。

答案 1 :(得分:2)

试试这个: 编辑:查看对子域的更改,使用%1从RewriteCond捕获

RewriteEngine On
# Check if the hostname requested is subdomain.example.com or empty
# Now we attempt to capture the subdomain with (.*)? and reuse with %1
RewriteCond  %{HTTP_HOST} ^(.*)?example.com$ [NC]
RewriteCond %{HTTP_HOST} !^$
# Rewrite it as subdomain.example.nl and redirect the browser
RewriteRule ^(.*) http://%1example.nl$1 [L,R,NE,QSA]

# Note: With the above edit for %1, this part should no longer be necessary.
# Then do the same for example.com, with or without the www
RewriteCond  %{HTTP_HOST} ^(www\.)?example.com$ [NC]
RewriteCond %{HTTP_HOST} !^$
RewriteRule ^(.*) http://www.example.nl$1 [L,R,NE,QSA]