我有以下问题。我们在同一页面上使用了许多不同的网址。现在我们只想为这些页面使用一个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]
或者有更好的方法吗?任何提示都会有很大帮助。
答案 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.com
,dev2.example.com
等将“假冒”域名添加到/etc/hosts
,作为别名127.0.0.1