mod_rewrite有两个服务器和三个子域?

时间:2011-11-14 22:10:28

标签: apache mod-rewrite dns

我一直在寻找(这里和谷歌),我找不到真正适合我的答案。基本上,我有两个物理服务器(开发服务器和生产服务器),我希望能够在我的git仓库中使用一个.htaccess文件。

通常情况下这并不困难,但我有两个域名example.comlongexample.com。我在我的DNS主机上将longexample.comdev.longexample.com的CNAME设置为example.com(和dev.example.com),并在两台服务器上设置apache ServerName / ServerAlias:

dev server:
    ServerName dev.example.com
    ServerAlias dev.longexample.com

prod server:
    ServerName example.com
    ServerAlias longexample.com
    ServerAlias www.example.com
    ServerAlias www.longexample.com

这是我的.htaccess文件:

Options +FollowSymlinks +Indexes
RewriteEngine on

# RewriteCond %{HTTP_HOST} ^www.longexample.com$ [NC,OR]
# RewriteCond %{HTTP_HOST} ^longexample.com$ [NC,OR]
# RewriteCond %{HTTP_HOST} ^www.example.com$ [NC]
# RewriteRule ^(.*)$ http://example.com/$1 [R,N]

RewriteCond %{HTTP_HOST} ^dev\.longexample\.com$ [NC]
RewriteRule ^(.*)$ http://dev.example.com/$1 [R,L]

RewriteRule ^([^\.]+)$ $1.html [NC,L]
RewriteCond %{THE_REQUEST} ^GET\ ([^\.]+)\.(html|htm) [NC]
RewriteRule ^([^\.]+)\.(html|htm)$ %1 [R,NC,L]

据说前两个块应该重写prod并开发到正确的url(当一切正常时我将使它们成为301s),但它似乎不起作用。就像现在一样,它什么也没做。如果我将RewriteRule设置为[N]而不是[L],则会给我一个无限循环。

第一个块被注释掉了,因为如果我让它在开发服务器上工作,那么prod的解决方案应该很明显。最后一个块向example.com/about.html请求重定向到example.com/about(同时仍然使用/about.html文件。该部分正常工作。

使用两个域是否存在问题?我也尝试使用%{SERVER_NAME}代替%{HTTP_HOST},但没有任何变化。

1 个答案:

答案 0 :(得分:1)

啊哈,想通了!似乎有[OR]链条混乱了。这是有效的:

Options +FollowSymlinks +Indexes
RewriteEngine on

RewriteCond %{HTTP_HOST} ^www\.yoshokatana\.com$ [NC,OR]
RewriteCond %{HTTP_HOST} ^yoshokatana\.com$ [NC]
RewriteRule ^(.*)$ http://yosho.me/$1 [R=301,L]

RewriteCond %{HTTP_HOST} ^www\.yosho\.me$ [NC]
RewriteRule ^(.*)$ http://yosho.me/$1 [R=301,L]

RewriteCond %{HTTP_HOST} ^dev\.yoshokatana\.com$ [NC]
RewriteRule ^(.*)$ http://dev.yosho.me/$1 [R,L]

RewriteRule ^([^\.]+)$ $1.html [NC,L]
RewriteCond %{THE_REQUEST} ^GET\ ([^\.]+)\.(html|htm) [NC]
RewriteRule ^([^\.]+)\.(html|htm)$ %1 [R=301,NC,L]