我将子网站组织到LAMP服务器上的不同文件夹中以便于维护,但不希望最终用户知道他们是通过URL组织到这些文件夹中的。
目录结构示例:
/category1/website1
/category1/website2
/category2/website3
/category2/website4
/category2/website5
/category3/website6
/category4/website7
etc.
目前它显示为http://www.example.com/category1/website1
但是我希望它始终显示为http://www.example.com/website1
- 即使他们将类别名称放在那里。
诀窍是我需要从.htaccess
文件中执行此操作,其中包含X个子类别的X个类别。目前我正在使用
Redirect 301 /website1 /category1/website1
每个网站允许用户使用较短的链接,但最终他们最终会看到地址中的类别,.htaccess
文件很长,涉及200多个子网站。 :(
任何帮助将不胜感激!
答案 0 :(得分:0)
使用mod_rewrite
如果您要手动输入它们,那么它非常简单:
RewriteEngine on
RewriteRule ^/website1$ /category1/website1 [L,NC]
RewriteRule ^/website2$ /category1/website2 [L,NC]
也可以创建RewriteMap
。 documention
希望有所帮助。
答案 1 :(得分:0)
由于没有可辨别的“样式”将网站链接到 category 子目录,并且您只能使用.htaccess
,因此只能选择手动列出您的所有映射.htaccess
文件,以与您列出重定向相同的方式。
假设您要内部重写将/website1/<something>
格式的URL改成/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
后向引用包含URL路径减去/category/
前缀。