【问题标题】:Making a 301 rewrite from within a folder using relative rewrite URLs使用相对重写 URL 从文件夹中进行 301 重写
【发布时间】:2010-10-26 16:31:14
【问题描述】:

我有以下问题。我们在同一个页面上使用了许多不同的 URL。现在我们只想为这些页面使用一个 URL。举个例子:

RewriteRule ^(subfolder1/folder1/|(subfolder2|subfolder3)/folder2/|folder3/)?(name1|name2|name3|name4)$ scriptname.php [QSA,NC]

如您所见,它非常混乱。我现在要做的是:使用 301 将所有 URL 仅重写为其中一个 URL(例如 subfolder1/folder1/name1),而不是在该 URL 上使用重写来处理实际脚本。它可能看起来像这样:

RewriteRule ^((subfolder2|subfolder3)/folder2/|folder3/)?(name2|name3|name4)$ /subfolder1/folder1/name1 [R=301,QSA,NC]
RewriteRule ^subfolder1/folder1/name1$ script.php [QSA.NC]

直到这里我没有问题。但现在是棘手的部分。我们在 UNIX 和 Windows 机器上使用了几台开发机器。它们都有不同的主机名和文件夹。以下是一些示例:

http://www.example.com (production)
http://test.example.com (testing)
http://localhost/development_folder/ (development WIN)
http://localhost:8888/development_folder/ (development MAC)

问题是,由于我们在开发机器上有子文件夹,我不能像 /subfolder1/folder1/name1/ 那样使用绝对 URL,例如指向http://localhost/subfolder1/folder1/name1/ 而不是http://localhost/development_folder/subfolder1/folder1/name1/,所以所有的重写都会在开发机器上被破坏。

有没有机会解决这个问题?由于文件夹development_folder在所有开发机器上都是相同的,是否有助于将该文件夹排除/包含到之后的重写中,如下所示:

RewriteRule ^((subfolder2|subfolder3)/folder2/|folder3/)?(name2|name3|name4)$ /development_folder/subfolder1/folder1/name1 [R=301,QSA,NC]
RewriteRule ^development_folder/(.*)$ $1 [QSA.NC]
RewriteRule ^subfolder1/folder1/name1$ script.php [QSA.NC]

或者有更好的方法吗?任何提示都会有很大帮助。

【问题讨论】:

    标签: .htaccess mod-rewrite redirect url-rewriting


    【解决方案1】:

    我会使用 Apache Include 指令来修改规则集。这样我就可以测试将在生产中使用的规则。

    我不记得将包含通配符解析为不包含文件是否存在问题,但如果存在问题,您可以在生产中使用空文件,而实际的开发人员在开发人员中重写规则之一。

    RewriteRule ^((subfolder2|subfolder3)/folder2/|folder3/)?(name2|name3|name4)$ /subfolder1/folder1/name1 [R=301,QSA,NC]
    Include /etc/apache/conf.d/*_dev.rewrites
    RewriteRule ^subfolder1/folder1/name1$ script.php [QSA.NC]
    

    在您的开发机器上,并且只有在您的开发机器上有 /etc/apache/conf.d/my_dev.rewrites:

    RewriteRule ^development_folder/(.*)$ $1 [QSA.NC]
    

    【讨论】:

    • 好的,如果我有不同的 DEV 机器(MAC 和 Windows),我可以在“包含”之前使用一个语句来处理它吗?我对 Apache 文件不是很熟悉。
    • 顺便说一句:很抱歉我的投票迟到了,所以你还没有收到赏金。因此,我对您的 10 个答案进行了投票,以给您丰厚的奖励 :)
    • 您可以在同一台机器或不同机器上拥有 mac_dev.rewrites 和 windows_dev.rewrites。他们都会被拉进来。
    【解决方案2】:

    每个目录的 RewriteRules(在 .htaccess 中)不能工作吗?然后,您可以指定一个相对替换(前面不带 /),或者如果需要,可以指定一个绝对替换(带 /)。

    使用相对路径,基本路径将在重写之前被剥离,然后再次添加前缀。也许,您需要调整 RewriteBase 以使其正常工作(嗯,不同的服务器不同...)。

    【讨论】:

      【解决方案3】:

      我认为开发/生产服务器布局存在更深层次的问题,但我想你有你的理由。 这可以帮助您:

      # dev
      RewriteCond %{HTTP_HOST} ^localhost$ [NC]
      RewriteRule ^((subfolder2|subfolder3)/folder2/|folder3/)?(name2|name3|name4)$ /subfolder1/folder1/name1 [R=301,QSA,NC]
      RewriteRule ^subfolder1/folder1/name1$ script.php [QSA.NC]
      
      # production
      RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
      RewriteRule ^((subfolder2|subfolder3)/folder2/|folder3/)?(name2|name3|name4)$ /dev_folder/subfolder1/folder1/name1 [R=301,QSA,NC]
      RewriteRule ^dev_folder/subfolder1/folder1/name1$ script.php?dev=1 [QSA.NC]
      

      这个想法是使用主机名来拥有一组不同的规则。您可以根据需要使用dev1.example.comdev2.example.com 等将“假”域添加到/etc/hosts 作为 127.0.0.1 的别名

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-23
        • 2019-09-28
        • 1970-01-01
        • 2015-10-19
        • 2018-08-25
        • 2020-09-06
        • 2023-04-03
        • 1970-01-01
        相关资源
        最近更新 更多