使用 Mod_Rewrite 将 ROOT 重写到另一个路径

Posted

技术标签:

【中文标题】使用 Mod_Rewrite 将 ROOT 重写到另一个路径【英文标题】:Use Mod_Rewrite to Rewrite ROOT to Another Path 【发布时间】:2011-02-15 12:34:27 【问题描述】:

注意:我已经尝试过this question 下的建议,但它们要么不起作用,要么给我一个无限重定向循环错误。

我的 .htaccess 文件中有以下内容:

<IfModule mod_rewrite.c>

    Options +FollowSymLinks
    RewriteEngine On
    RewriteBase /

    # Rewrite old links to new
    Redirect 301 /howitworks.php        /how-it-works
    Redirect 301 /testimonials.php      /testimonials
    Redirect 301 /contact_us.php        /customer-service
    Redirect 301 /affiliates.php        /affiliates
    Redirect 301 /account.php           /customer/account
    Redirect 301 /shopping_cart.php     /checkout/cart
    Redirect 301 /products.php          /starter-kits
    Redirect 301 /login.php             /customer/account/login

    # Force to Admin if trying to access admin
    RewriteCond %HTTP_HOST www\.example\.com [NC]
    RewriteCond %REQUEST_URI admin [NC]
    RewriteRule ^(.*)$ https://admin.example.com/index.php/admin [R=301,L,QSA]

    # Compress, Combine and Cache javascript/CSS
    RewriteRule ^(index.php/)?minify/([^/]+)(/.*.(js|css))$ lib/minify/m.php?f=$3&d=$2

    # Always send 404 on missing files in these folders
    RewriteCond %REQUEST_URI !^/(media|skin|js)/

    # Never rewrite for existing files, directories and links
    RewriteCond %REQUEST_FILENAME !-f
    RewriteCond %REQUEST_FILENAME !-d
    RewriteCond %REQUEST_FILENAME !-l
    RewriteCond %REQUEST_URI !server-status

    # Rewrite everything else to index.php
    RewriteRule .* index.php [L]

    # Force www in url and non-example domains to example
    RewriteCond %HTTP_HOST !^www\.example\.com [NC]
    RewriteCond %HTTP_HOST !^ww2\.example\.com [NC]
    RewriteCond %HTTP_HOST !^qa\.example\.com [NC]
    RewriteCond %HTTP_HOST !^uat\.example\.com [NC]
    RewriteCond %HTTP_HOST !^local\.example\.com [NC]
    RewriteCond %HTTP_HOST !^admin\.example\.com [NC]
    RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L,QSA]

</IfModule>

我需要进行以下重写:

重写:http://subdomain.example.com/ http://subdomain.example.com/page

我也希望这样可以隐藏 /page(/ 会像 /page 一样),但这不是必要的要求。另外,我希望它可以与 HTTP 或 HTTPS 一起使用。

非常感谢任何帮助,因为我已经为此苦苦挣扎了几个小时。

【问题讨论】:

这个问题属于ServerFault。 【参考方案1】:

根路径的正确重定向很简单:

RewriteEngine On
RewriteRule ^/$ /page [R]

仅在一个子域上强制执行此操作(如果您的重写块位于虚拟主机定义中,则几乎不会发生这种情况):

RewriteEngine on
RewriteCond %HTTP_HOST =subdomain.example.com
RewriteRule ^/$ /page [R]

【讨论】:

这个答案在 htaccess 上下文中根本不起作用,并且会完全重定向到客户端(IOW 不会按要求“隐藏”) 当我使用 ^/$ 而不是 ^$ 时,这只对我在 apache2 上有效。是答案不正确还是我弄错了? 错误:RewriteRule ^$ /page [R] 正确:RewriteRule ^/$ /page [R] @KonstantinSchubert 如果这对您有用,那么您可能不会使用 htaccess。模式 ^/$ 适用于 server.config 上下文。 .htaccess 使用不带前导斜杠的相对路径模式。 ^$ 是在 htaccess 中使用 RewriteRule 匹配主页的有效模式。 .htaccess 文件中使用^$ 而不是^/$ 工作【参考方案2】:

复制我删除的回复:

在您的文档根目录的 htaccess 中:

RewriteEngine on
RewriteCond %HTTP_HOST =subdomain.example.com
RewriteRule ^$ /page

【讨论】:

不确定为什么会被删除...RewriteRule ^$ /page 似乎是唯一有效的答案。 RewriteRule ^/$ /page 确实 NOT 将请求匹配到站点的文档根目录。我正在修改当前接受的答案,使其正确。【参考方案3】:

你有两个选项可以将你的根目录重写到另一个路径,

    目录索引:

    DirectoryIndex anotherPath
    

    模组重写:

    RewriteEngine on
    RewriteRule ^/?$ /anotherPath [L]
    

您可以使用上述选项之一在内部将example.com/ 重定向到example.com/anotherPath

参考资料:

    https://httpd.apache.org/docs/current/mod/mod_dir.html http://httpd.apache.org/docs/current/mod/mod_rewrite.html

【讨论】:

以上是关于使用 Mod_Rewrite 将 ROOT 重写到另一个路径的主要内容,如果未能解决你的问题,请参考以下文章

mod_rewrite 到 nginx 重写规则

Apache Rewrite(mod_rewrite)无法重写,如果目录名与root下的另一个目录相同,例如Linux上的“lib”

mod_rewrite:重写规则还是重定向?

如何在 apache 上用 mod_rewrite 重写我的 url?

子域 mod_rewrite (htaccess) 到相对目录

mod_rewrite - 重写目录以查询字符串,除了 /#!/