Apache 可伸缩URL重写规则

Apache 可伸缩URL重写规则,apache,.htaccess,mod-rewrite,Apache,.htaccess,Mod Rewrite,为了便于维护,我将子网站组织到LAMP服务器上的不同文件夹中,但不希望最终用户知道它们是通过URL组织到这些文件夹中的 目录结构示例: /category1/website1 /category1/website2 /category2/website3 /category2/website4 /category2/website5 /category3/website6 /category4/website7 etc. 目前显示为http://www.example.com/category

为了便于维护,我将子网站组织到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多个子网站

任何帮助都将不胜感激

使用mod_rewrite,如果您要手动将它们输入:

RewriteEngine on
RewriteRule ^/website1$ /category1/website1 [L,NC]
RewriteRule ^/website2$ /category1/website2 [L,NC]
也可以创建一个重写映射。网站上有很多有用的信息


希望能有所帮助。

由于没有可识别的模式将网站链接到类别子目录,并且您仅限于.htaccess,因此您别无选择,只能手动列出.htaccess文件中的所有映射,就像列出重定向一样

假设您希望在内部重写/website1/to/category1/website1/-表单的URL,重定向指令的工作方式与前缀匹配相同

您可以在.htaccess中执行以下操作:

$1是对RewriteRule模式中捕获的组的反向引用。如果您请求/website1/foo,那么它将重写为/category1/website1/foo

这确实要求您至少请求/website1/,并带有一个尾随斜杠,因为这是一个排序目录

您可以潜在地将属于同一类别的站点分组在一起。例如:

RewriteRule ^((website3|website4|website5)/.*) /category2/$1 [L]
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^category1/(.*) /$1 [R=302,L]
我希望它显示为http://www.example.com/website1 所有的时间-即使他们把类别名称放在那里

为此,您需要执行相反的。。。从URL中删除类别的重定向。然而,另一个复杂的问题是,您只想重定向直接请求,而不想像上面那样重写请求

这需要在上面的内部重写之前进行

除非存在区分类别名称的可识别模式,否则您需要为每个类别制定规则。例如:

RewriteRule ^((website3|website4|website5)/.*) /category2/$1 [L]
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^category1/(.*) /$1 [R=302,L]
…并对每个类别重复

对REDIRECT_STATUS环境变量的检查确保我们只针对直接请求,而不是重写请求

将302临时更改为301永久-如果这是您的意图-只有在您确认其工作正常后,才能更改为301永久,以避免缓存问题

但是,使用每个类别子目录中的附加.htaccess文件来实现这一点可能更容易,也更具可扩展性。这将是每个类别子目录中的相同指令:

RewriteEngine On

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule (.*) /$1 [R=302,L]

由于RewriteRule模式匹配的URL路径是相对于包含.htaccess文件的目录的,因此$1反向引用包含URL路径减去/category/前缀。

您如何知道网站属于哪个类别?如果将/website1重定向到/category1/website1,您如何知道website1在category1中?我遗漏了什么吗?我手动为每个网站创建了目录,每个网站都有一个唯一的名称,因此,例如,website1永远不会包含在多个类别中。在内部,它们的命名是合乎逻辑的,有点像苹果属于水果类而不是肉类类。这就是你要问的吗?是的,但是你不能在不知道与网站相关的类别的情况下动态重定向。您必须将类别/网站映射存储在某个位置,或者需要对其进行硬编码。好的,如果您能告诉我如何为多个网站手动进行映射,那么至少这比仍然显示类别名称的重定向301要好。谢谢相信我,论坛发帖是我在网上查看和查看文档后的最后手段!在尝试您的示例时,它似乎只是重定向,就像重定向301一样,我的意图是隐藏类别文件夹名称。大多数在线示例都显示了如何在单个网站上执行此操作,但据我所知不是多个网站。示例:--RewriteCond%{REQUEST_URI}/category1/----RewriteRule^.*$category1/$1[L]您还有其他重定向吗?示例不应重定向。@gcs如果您看到重定向,则很可能是您先前尝试的缓存301重定向。您需要清除浏览器缓存并删除现有的mod_alias重定向指令。目前,由于RewriteRule模式中的斜杠前缀,上述指令在.htaccess上下文中实际上不会执行任何操作。他们也不会重写除/website1和/website1/之外的任何内容。那又会怎样呢 无法执行任何操作,因为mod_dir将301重定向/website1到/website1/以附加尾部斜杠。