如何通过 .htaccess 实现 live.mywebsite.com => mywebsite.com/live?

如何通过 .htaccess 实现 live.mywebsite.com => mywebsite.com/live?

我需要做以下事情

  1. 将此子域 live.mywebsite.com/something 映射到 mywebsite.com/live/something 例如:
    www.live.mywebsite.com/==> www.mywebsite.com/live/ http://live.mywebsite.com/==> http://mywebsite.com/live/ www.live.mywebsite.com/something==> www.mywebsite.com/live/something http://live.mywebsite.com/something==>http://mywebsite.com/live/something

  2. 我想在网络浏览器中隐藏重写的 URL。将显示此域名,www.live.mywebsite.com/something而不是www.mywebsite.com/live/something

    3- Live 是 wordpress 中一个类别的名称,但没有名为“live”的文件夹

以下是我所拥有的.htaccess

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

仅供参考,我已通过 Parallels Power Panel 添加了子域。

还有一件事,我无法安装任何插件来完成这项工作。

答案1

看起来你想要VirtualDocumentRoot。例如:

<VirtualHost *:80>
    ServerName mywebsite.com
    ServerAlias www.mywebsite.com
    DocumentRoot /var/www/
    <Directory /var/www/>
        Order Allow,Deny
        Allow from all
    </Directory>
</VirtualHost>
<VirtualHost *:80>
    ServerName subdomains.mywebsite.com
    ServerAlias *.mywebsite.com
    VirtualDocumentRoot /var/www/%-3/
    <Directory /var/www/>
        Order Allow,Deny
        Allow from all
    </Directory>
</VirtualHost>

这将使用域名的倒数第三部分作为正常 webroot 下的子目录,因此live对于www.live.mydomain.comstuff对于a.b.c.d.stuff.mydomain.com

答案2

让我们看看我是否理解正确:

您有一个由以下部分组成的 URL:

(www.)category.domain.com/(something) 

这需要重写为

(www.)domain.com/category/(something).

我认为您可以使用 RewriteRules 来实现这一点,而且您似乎已经完成了一部分。由于您无论如何都要通过反向代理隐藏目标 URL,因此我们可以忽略任何开头的 www,并且我们只需代理到 localhost。

RewriteCond %{HTTP_HOST}     ([^.]+)\.domain.com
RewriteCond %1               !www
Rewriterule (.*)             http://localhost/%1/$1   [P]

这会在内部代理到 localhost。这样做的好处是不会陷入循环。第二个 RewriteCond 是为了避免代理 www.domain.com(这可能是您管理网站的地方...)

Wordpress 在 .htaccss 中添加了自己的规则,您需要将这些规则放在前面。因此,您最终可能会得到类似这样的结果:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_HOST}     ([^.]+)\.domain.com
RewriteCond %1               !www
Rewriterule (.*)             http://localhost/%1/$1   [P]
</IfModule>

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

但是您可以将其与 wordpress .htaccess 规则相结合,这样您就不需要内部代理了......

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

RewriteRule ^index\.php - [L]

RewriteCond %{HTTP_HOST}     ([^.]+)\.domain.com
RewriteCond %1               !www
Rewriterule (.*)             index.php/%1/$1   [L]

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

注意:您需要将第一条规则从仅匹配 index.php 更改为匹配以 index.php 开头的任何内容...

相关内容