【问题标题】:htaccess redirects for usernames in URL while ignoring directorieshtaccess 在忽略目录的同时重定向 URL 中的用户名
【发布时间】:2017-04-03 23:28:04
【问题描述】:

我遇到了一个复杂的 .htaccess 重定向问题。我正在尝试将旧站点关联公司重定向到第二个域,其结构可以如下:

  1. username.domain.com 重定向到 seconddomain.com/username
  2. domain.com/username 重定向到 seconddomain.com/username
  3. www.domain.com 需要重定向到 domain.com,而不是 secondomain.com/www
  4. domain.com 和子目录(即 css、js、img)不会被重定向

下面是我当前的 .htaccess,但是它错误地将 www.domain.com 重定向到 seconddomain.com/www 并且错误地将指向 js、css 和 img 目录的链接也重定向到了 seconddomain:

<IfModule mod_rewrite.c>

Options +FollowSymLinks 

RewriteEngine on
RewriteOptions inherit

RewriteCond %{HTTP_HOST} ^www\.domain\.com/*$
RewriteRule ^(.*)$ https://seconddomain.com/$1/ [R=301,L]

RewriteCond %{HTTP_HOST} ^(.*)\.domain\.com
RewriteRule ^(.*)$ https://seconddomain.com/%1/ [R=301,L]

RewriteCond %{HTTP_HOST} .*
RewriteRule ^(.+)$ https://seconddomain.com/$1/ [R=301,L]

</IfModule>

【问题讨论】:

  • 在这里,接受我的投票(投赞成票)...为数不多的非常清晰且结构良好的 apache 重写问题之一 :) 我一有时间就可以解决您的解决方案 :D
  • 问题:如何区分用户名和子目录?因为我得到了你的解决方案,除了 domain.com/username 和 domain.com/css,js 等的最后一部分。应该区分:/
  • 我认为我无法区分用户名和子目录,因为可能有数千个用户名。但是,我可以设置有限数量的目录。因此,如果我设置了一组有限的目录,我可以以某种方式忽略这些目录而不忽略任何不匹配的内容吗?

标签: apache .htaccess redirect mod-rewrite


【解决方案1】:

您列出了四个案例:

  1. username.example.com 重定向到 secondexample.com/username
  2. example.com/username 重定向到 secondexample.com/username
  3. www.example.com 需要重定向到 example.com,而不是 secondexample.com/www
  4. example.com 和子目录(即 css、js、img)无法获取 重定向

以下应处理这些情况:

RewriteEngine on

#should handle case 3) www.example.com needs to redirect to example.com, not secondexample.com/www
RewriteCond %{HTTP_HOST} ^www\.example\.com$
RewriteRule ^(.*)$ https://example.com/$1/ [R=301,END]

#should handle case 1) username.example.com redirects to secondexample.com/username
RewriteCond %{HTTP_HOST} !^www\.example\.com$
RewriteCond %{HTTP_HOST} ^(.+)\.example\.com
RewriteRule ^(.*)$ https://secondexample.com/%1/ [R=301,L]

#should handle case 2) example.com/username redirects to secondexample.com/username
#and 4) example.com and subdirectories (i.e. css, js, img) don't get redirected
RewriteCond %{HTTP_HOST} ^example\.com
RewriteCond %{REQUEST_URI} !^/(css|js|img|<add-more-if-needed>)
RewriteCond %{REQUEST_URI} !^/$
RewriteRule ^(.*)$ https://secondexample.com/$1/ [R=301,L]

【讨论】:

  • 我已经换掉了我的代码来测试你上面的代码。然而,现在规则 #3 将 www.domain.com 重定向到 domain.com,然后再重定向到 seconddomain.com。我认为我们需要一个额外的规则,以便 domain.com 本身不会重定向到 seconddomain.com。
  • 忽略我指定的子目录的规则非常有效。
  • 因为我可以选择忽略特定的子目录(即 css),为了我的目的,我可以将 www.domain.com 重定向到 domain.com/subdir/ 而不会影响我的用户。我正在努力让 domain.com 重定向到 domain.com/subdir/,由于我相信规则 #1,它一直被重定向到 seconddomain.com。
  • 对于它的价值,由于遗留体系结构,我无法使用用户子目录。我已经在上面发布了我正在尝试的最新代码的改编。 (注意:我的词典从 domain.com 更改为 example.com,所以我可以发布)。现在,www.example.com 重定向到 example.com/test,但 example.com(没有 www)重定向到 secondexample.com。
  • 我相应地缩短了我的答案并将[L] 交换为[END] 我不是100% 确定最后一个RewriteCond %{REQUEST_URI} !^/$ 可以按预期工作,但是请尝试我的更新代码,让我知道它是如何工作的去了;)
【解决方案2】:

这就是我现在所拥有的。一切正常,除了 example.com 正在重定向到 secondexample.com。 www.example.com 实际上重定向到 example.com/test/ ,因为我已将 test 添加到我忽略的子目录中。

RewriteEngine on

#should handle case 3) www.example.com needs to redirect to example.com, not 
#secondexample.com/www
RewriteCond %{HTTP_HOST} ^www\.example\.com$
RewriteRule ^(.*)$ http://example.com/test/$1/ [R=301,L]

#should handle case 1) username.example.com redirects to 
#secondexample.com/username
RewriteCond %{HTTP_HOST} !^www\.example\.com$
RewriteCond %{HTTP_HOST} ^(.+)\.example\.com
RewriteRule ^(.*)$ https://secondexample.com/%1/ [R=301,L]

#should handle case 2) example.com/username redirects to 
#secondexample.com/username
#and 4) example.com and subdirectories (i.e. css, js, img) don't get 
#redirected
RewriteCond %{HTTP_HOST} ^example\.com
RewriteCond %{REQUEST_URI} !^/(css|scripts|img|video)
RewriteRule ^(.*)$ https://secondexample.com/$1/ [R=301,L]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-20
    • 2016-01-30
    • 2013-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    相关资源
    最近更新 更多