使用相对重写URL在文件夹中进行301重写

时间:2010-10-26 16:31:14

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

我有以下问题。我们在同一页面上使用了许多不同的网址。现在我们只想为这些页面使用一个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)

问题是,由于我们在开发机器上有子文件夹,因此我不能将绝对URL用作/subfolder1/folder1/name1/,因为它会像指向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]

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

3 个答案:

答案 0 :(得分:1)

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

我不记得解析include通配符是否存在包含没有文件的问题,但是如果有,你可以在生产中使用空文件,而实际的dev重写规则是dev中的一个。

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]

答案 1 :(得分:0)

每个目录的RewriteRules(在.htaccess中)不会有效吗?然后你可以指定一个相对替换(没有/在前面),或者,如果你需要它,一个绝对的(用/)。

对于相对的一个,基本路径将在重写之前被剥离,然后再次作为前缀。也许,你需要调整RewriteBase才能正常工作(嗯,不同的服务器......)。

答案 2 :(得分:0)

我认为dev / production服务器布局存在更深层次的问题,但我想你有理由。 这可以帮到你:

# 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