由于没有可识别的“模式”将网站链接到类别子目录,并且您仅限于此,.htaccess
因此您别无选择,只能手动列出.htaccess
文件中的所有映射,就像列出重定向一样。
假设您想在内部将表单的 URL重写/website1/<something>
为/category1/website1/<something>
- 与Redirect
指令的工作方式相同(即前缀匹配)。
您可以在中执行以下操作.htaccess
:
RewriteEngine On
RewriteRule ^(website1/.*) /category1/$1 [L]
RewriteRule ^(website2/.*) /category1/$1 [L]
$1
是对RewriteRule
模式中捕获的组的反向引用。例如。如果您请求/website1/foo
,它将重写为/category1/website1/foo
.
这确实要求您至少请求/website1/
,并带有斜杠(因为这是一个目录)。
您可以将属于同一类别的网站组合在一起。例如:
RewriteRule ^((website3|website4|website5)/.*) /category2/$1 [L]
我希望它一直显示http://www.example.com/website1
-即使他们将类别名称放在那里
为此,您需要实现反向...重定向以从 URL中删除类别。但是,一个额外的复杂性是您只想重定向直接请求而不是重写请求(如上所述)。
这需要在上面的内部重写之前进行。
除非有可辨别的模式来区分类别名称,否则您将需要为每个类别制定规则。例如:
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^category1/(.*) /$1 [R=302,L]
...并为每个类别重复。
对REDIRECT_STATUS
环境变量的检查确保我们只针对直接请求而不是重写请求。
将 302(临时)更改为 301(永久) - 如果这是有意的 - 只有在您确认它可以正常工作以避免缓存问题之后。
.htaccess
但是,这可能更容易(并且更“可扩展”)在每个类别子目录中使用附加文件来实现。这将是每个类别子目录中的相同指令:
RewriteEngine On
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule (.*) /$1 [R=302,L]
由于RewriteRule
模式匹配的 URL 路径是相对于包含.htaccess
文件的目录的,因此$1
反向引用包含减去/category/
前缀的 URL 路径。