如果网址不包含字符串,则重定向,保持网址的其余部分不变

时间:2018-10-22 15:55:11

标签: apache .htaccess redirect mod-rewrite

因此,我们试图将旧的子域重定向到我们的新域,并保持URL的其余部分不变。我们正在尝试将所有内容移至子目录。

通过以下操作很容易...

RewriteCond %{HTTP_HOST} ^test\.example\.com/$ [NC]
RewriteRule ^(.*)$ https://example.com/test-path/$1 [R=302,L]

但是,以前的某些站点URL实际上已经是test.example.com/test-path/,因此我们希望这些站点的URL不在/test-path/

上加倍

该规则正在转换这样的网址...

test.example.com/test-path/some-page

进入

test.example.com/test-path/test-path/some-page

所以现在我们正在尝试以下内容...

RewriteCond %{REQUEST_URI} !/test-path/
RewriteCond %{HTTP_HOST} ^test\.example\.com/$ [NC]
RewriteRule ^(.*)$ https://example.com/test-path/$1 [R=302,L]

尽管它将重定向到example.com/test-path/,但现在它丢失了普通URL之后的所有内容。

test.example.com/test-path/other-path

被重定向到

example.com/test-path/

希望这对我们正在尝试做的事情有意义。将一个子域重定向到一个新域到一个子目录中,而不是将request-url目录加倍。

编辑:

最近一次尝试,似乎也不在乎该URL是否包含/test-path/。无论如何,它仍然会重定向。

1 个答案:

答案 0 :(得分:2)

RewriteCond %{HTTP_HOST} ^test\.example\.com/$ [NC]
RewriteRule ^(.*)$ https://example.com/test-path/$1 [R=302,L]

我认为这只是您的问题(?)中的错字,但是您的主机名末尾有一个错误的斜杠-这将永远不匹配。

为避免在请求的URL上出现/test-path时重复复制/test-path,但仍将其重定向到RewriteCond %{HTTP_HOST} ^test\.example\.com [NC] RewriteRule ^(?:test-path/)?(.*) https://example.com/test-path/$1 [R=302,L] ,您可以将其捕获为可选 URL路径,如果匹配则将其丢弃。例如:

$

我删除了 CondPattern 上的斜杠和结尾的(?:test-path/)?,以使其与FQDN匹配(并因此规范化),并以点结尾。

test-path/是一个捕获?的非捕获组(因此不会创建任何反向引用)。然后使该组为可选项,并在其后跟RewriteCond %{REQUEST_URI} !/test-path/ RewriteCond %{HTTP_HOST} ^test\.example\.com/$ [NC] RewriteRule ^(.*)$ https://example.com/test-path/$1 [R=302,L]


旁边:

/test-path/

如果在请求的URL中的任何位置出现/test-path/,此操作将无效。因此,如果您看到重定向,则似乎是“其他”!

  

最近一次尝试,似乎也不在乎该URL是否包含.htaccess。无论如何,它仍然会重定向。

正如我所说,必须做些其他事情。可能与其他指令冲突?您是否正在混合来自mod_alias和mod_rewrite的重定向?

请注意,这些重定向应放在File: a smallint b timestamp c date d varchar O/P: a smallint dateformat(b,'YYYY-MM-DD HH:NN:SS.sss') dateformat(c.'YYYY-MM-DD') d varchar 文件的顶部。