Apache Rewrite:不匹配模式不起作用

时间:2012-06-12 10:19:23

标签: apache mod-rewrite

我想将访问者重定向到我的主域,当他们在我的子域上执行请求后跟不匹配的URI。

例如,访问者可以访问sub.domain.com/product/10处的资源,但当他尝试访问与我的子域domain.com不匹配的其他资源时,应将其重定向到product/:id,如sub.domain.com/anOtherResource 1}}。

我必须使用apache重写模块执行此操作。我发现!运算符可以完成这项工作,但它对我不起作用。

这是我的.htaccess文件的重写配置:

RewriteCond %{HTTP_HOST} sub\.domain\.com
RewriteCond %{REQUEST_URI} !^/product/[0-9]+$
RewriteRule ^(.*)$ http://www.domain.com [L,R]

我也测试了这个配置:

RewriteCond %{HTTP_HOST} sub\.domain\.com
RewriteRule !^/product/[0-9]+$ http://www.domain.com [L,R]

我不知道错误在哪里......

[编辑]

.htaccess文件是为Wordpress配置的。这是整个.htaccess:

<IfModule mod_rewrite.c>
    RewriteEngine On

    RewriteCond %{HTTP_HOST} sub.domain.com
    RewriteCond %{REQUEST_URI} !^/product/[0-9]+$
    RewriteRule ^(.*)$ http://www.domain.com/$1 [L,R]

    RewriteBase /
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
</IfModule>

2 个答案:

答案 0 :(得分:4)

问题出在Wordpress Rewrite配置中,发生了什么事?

第1步

我在sub.domain.com/product/1上执行请求,因此不匹配这些RewriteCond:

RewriteCond %{HTTP_HOST} sub.domain.com
RewriteCond %{REQUEST_URI} !^/product/[0-9]+$

然后,重定向到www.domain.com

第2步

继续重写到下一个Cond(Worpdress重写):

RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

在此步骤中,它会将内部重定向(未发送到客户端)发送到sub.domain.com/index.php

第3步

由于重定向,它再次应用了之前的RewriteCond

RewriteCond %{HTTP_HOST} sub.domain.com
RewriteCond %{REQUEST_URI} !^/product/[0-9]+$
RewriteRule ^(.*)$ http://www.domain.com/$1 [L,R]

匹配 Cond,然后将客户端重定向到www.domain.com,而我却没想到。

解决方案

我通过在index.php上添加RewriteCond来解决问题,如下所示:

RewriteCond %{HTTP_HOST} sub.domain.com
RewriteCond %{REQUEST_URI} !^/product/[0-9]+$
RewriteCond %{REQUEST_URI} !^/index.php$
RewriteRule ^(.*)$ http://www.domain.com/$1 [L,R]

现在它管理由Worpress重写发送的内部重定向。

答案 1 :(得分:0)

重写规则看起来不错,但请尝试以下方法:

RewriteCond %{HTTP_HOST} ^sub[.]domain[.]com$
RewriteCond %{REQUEST_URI} !^/product/[0-9]+$
RewriteRule ^(.*)$ http://www.domain.com [L,R]

如果这不起作用,那么您可能需要复制并粘贴VirtualHost配置的全部内容,因为它可能是其他导致问题的原因。