Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >mod_rewrite对子目录进行别名

mod_rewrite对子目录进行别名
EN

Stack Overflow用户
提问于 2011-07-21 06:33:58
回答 2查看 4K关注 0票数 3

我一直在和mod_rewrite做斗争。我们有许多客户端门户通过WordPress多站点运行,它们都是通过子目录portal访问的。

例如:http://www.mydomain.com/portal/clientA/

我想通过输入http://www.mydomain.com/clientA/就能到达那里,它会把我转到http://www.mydomain.com/portal/clientA/

到目前为止,我的情况是这样的,它并没有产生任何我能知道的重写:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
RewriteCond %{REQUEST_URI} /portal/
RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule . - [S=1]

RewriteRule /clientA(/?) /portal/clientA/

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

第二部分我无法触及,因为WordPress需要它。我的模式也是试图预测没有放入尾随斜线的人,因此出现了(/?)

编辑:--我还应该注意,我不想创建一个更一般的规则--我很乐意为每个新客户端添加一个重写规则,并且每次增加S=x数量。

编辑(8月11日),所以在稍作修改之后,这就是我的.htaccess所在的位置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
RewriteEngine On
RewriteRule ^clientA(/?) /portal/clientA/ [R]

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

不用说,它不起作用。但是,如果删除整个WordPress部分,则第一部分可以工作。我需要他们同时工作。导致第一部分失败的WordPress部件是什么?我认为这是RewriteBase和最后一条规则的结合,它将任何其他东西化成/index.php,坦白地说,这有点令人失望。事实上,我并不真正理解这个规则在多站点环境中是如何工作的,但它似乎是这样的。

最后的解决方案感谢LazyOne的正确答案!供其他人参考,我使用的最后解决方案是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
RewriteEngine On
RewriteRule ^clientA(/.+)? /portal/clientA$1 [R,L]
RewriteRule ^clientB(/.+)? /portal/clientB$1 [R,L]


# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-07-21 09:52:01

就这么简单:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
RewriteCond %{REQUEST_URI} !^/portal/
RewriteRule (.*) /portal/$1 [L]

它将重写(内部重定向)所有请求到/portal/文件夹(例如,/clientA/something => /portal/clientA/something)。

如果您只需要为某些客户端(或者更好地说,只针对特定的客户端文件夹,同时仍然有一些常规/公共文件夹)这样做,则可以对每个客户端使用此规则:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
RewriteRule ^clientA(.*) /portal/clientA$1 [L]

因此,.htaccess将如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
RewriteRule ^clientA(.*) /portal/clientA$1 [L]
RewriteRule ^clientB(.*) /portal/clientB$1 [L]

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
票数 2
EN

Stack Overflow用户

发布于 2012-11-21 14:54:20

我在这里发表了一些评论,但我认为,对于来到这里的人来说,这样做可能会更清楚一些。在操作点上,他找到了一种使用R行来实现该操作的方法,但是这消除了您创建的子目录URL结构,这在大多数URL重写中是可取的。所以,前面发布的答案是正确的,我并不反对,但取决于您的实现,您可能仍然会得到WordPress 404错误。这里有一个解决我的情况的办法,我认为这可能更常见。

在我的例子中,我需要这样的URL结构:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
http://mysite.com/p/profile_name/

每个来注册的用户都可以动态创建他/她自己的配置文件,除了对内容进行几处修改之外,在大多数情况下,将显示根目录下的所有WordPress内容。基本上,我需要这个:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
http://mysite.com/p/profile_name/(.*)

要改写为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
http://mysite.com/$1

这是发布在另一个答案中的.htaccess代码,它将正确地处理该规则:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
RewriteRule ^p/([-a-zA-Z0-9_]+)(/.*) $2 [L]

这方面的问题是,WordPress在理解$2是什么方面并不关心您的重写,因为WordPress使用$_SERVER‘’REQUEST_URI‘,不管您要重写什么,都是用户浏览器窗口中的内容。OP通过使用R选项找到了绕过这一问题的方法,但这会导致您丢失URL:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
RewriteRule ^p/([-a-zA-Z0-9_]+)(/.*) $2 [R,L]

重定向

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
http://mysite.com/p/profile/(.*)

至:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
http://mysite.com/$1

但是,用户以这种方式丢失了他唯一的URL。充其量,您可以添加一个查询字符串,以至少保留数据,但这样就失去了漂亮URL的意义。

我确实想出了一个解决方案;然而,它涉及黑客WordPress包含文件:(如果有人有更好的方法,请更新。我们开始:

溶液

我将我的.htaccess文件设置为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
#My addition:
RewriteRule ^p/([-a-zA-Z0-9_]+)(/.*) $2 [L]

RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

然后,我知道WordPress使用了REQUEST_URI变量,所以我进行了递归搜索,并在/wp-includes/class-wp.php中找到了这一行代码(第147行v3.4.2):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$req_uri = $_SERVER['REQUEST_URI'];

我把它改成了这个

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$req_uri = preg_replace(@'/^\/?p\/([-a-zA-Z0-9_]+)\//', '', $_SERVER['REQUEST_URI']);

这基本上只是通过过滤掉URI开头的概要文件来欺骗WordPress。

最后,我也需要一个解决方案,在网站内的链接。为此,我添加了一个过滤器:

注意事项:这些正则表达式中的一些可能有点疯狂;我是在过滤站点特定的内容,所以请将此作为一个概念,而不是复制/粘贴。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function mysite_wp_make_link_relative( $link ) {
    $sBaseUrl = (preg_match('/^\/(p\/[-a-zA-Z0-9_]+\/)(.*)/', $_SERVER['REQUEST_URI'], $matches)) ? $matches[1] : '';
    return preg_replace( '|https?://[^/]+/(.*)|i', '/' . $sBaseUrl . '$1', $link );
}
function rw_relative_urls() {
    $filters = array(
        'page_link', // Page link
        'home_url',
        'site_url',
        'get_site_url',
        'home_link',
    );
    foreach ( $filters as $filter ) {
        add_filter( $filter, 'mysite_wp_make_link_relative' );
    }
}

其中一些过滤器可能与此无关;我确信page_link和home_url是唯一重要的过滤器。无论如何,您需要内部链接到工作的代码。

我希望这会有所帮助,如果有人对此有任何意见,我将非常感谢。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6777779

复制
相关文章
配置Nginx目录别名Alias支持PHP解析
关于Nginx配置基础知识,PHP用FastCGI,在Apache里,有alias,比较方便,在Nginx下没有虚拟目录概念的,是用location配合alias使用,但使用alias标签的目录块中不能使用rewrite的break。
星哥玩云
2022/07/26
1.5K0
恢复WordPress分类目录的别名链接形式
注:内容很偏门,标题还真不知道如何拟,估计只有细看内容或有相同经历的朋友才看得懂俺说的是什么。 ---- 昨天下午自从在百度统计中使用了 SEO 建议之后,让我从下午一直折腾到晚上才算告一段落。原因是
张戈
2018/03/26
1.5K0
Apache URL重定向
Apached的重写功能,即是mod_rewrite模块功能,它是apache的一个模块。它的功能非常强大,可以操作URL中的所有部分。通过改写url,给用户提供一个简介大方的url,当用户访问时可以通过mod_rewrite模块功能转换为真正的资源路径。通过mod_rewrite能实现的功能还有很多,例如隐藏真实地址、实现URL跳转、域名跳转、防盗链、限制访问资源类型等等。
星哥玩云
2022/09/15
5.5K0
使用Python按另一个列表对子列表进行分组
在 Python 中,我们可以使用各种方法按另一个列表对子列表进行分组,例如使用字典和使用 itertools.groupby() 函数,使用嵌套列表推导。在分析大型数据集和数据分类时,按另一个列表对子列表进行分组非常有用。它还用于文本分析和自然语言处理。在本文中,我们将探讨在 Python 中按另一个列表对子列表进行分组的不同方法,并了解它们的实现。
很酷的站长
2023/08/11
4530
使用Python按另一个列表对子列表进行分组
Apache URL重写规则
  Apached的重写功能,即是mod_rewrite模块功能,它是apache的一个模块。它的功能非常强大,可以操作URL中的所有部分。
那一叶随风
2018/08/22
3K0
Apache URL重写规则
rolling invalidation对子游标产生的影响
一条SQL,使用了绑定变量,查看V$SQLAREA发现version_count是2,
bisal
2019/01/29
1K0
Centos对home目录进行扩容
-- 通过df -h 查看,/home目录大小不足。通过增加一块硬盘,扩大/home大小。
jwangkun
2022/01/09
6.2K0
Nginx目录浏览并进行美化
Nginx 作为一个高性能的 HTTP 和反向代理 web 服务器,默认不允许列出站点的整个目录,如果需要开启,可以通过配置打开此功能。
沈唁
2023/07/05
1.7K0
Nginx目录浏览并进行美化
Elasticsearch索引别名、Filtered索引别名、Template
在使用elasticsearch的时候,经常会遇到需要淘汰掉历史数据的场景。 为了方便数据淘汰,并使得数据管理更加灵活,我们经常会以时间为粒度建立索引,例如: 每个月建立一个索引:monthly-201709、monthly-201710、monthly-201711 每天建立一个索引:daily-20171015、daily-20171016、daily-20171017、daily-20171018 当不需要再继续使用历史数据的时候,我们就可以将索引删除,释放资源。 为了很好的支撑这个场景,需要使用到E
用户1225216
2018/03/05
2.9K0
Elasticsearch索引别名、Filtered索引别名、Template
Apache中 RewriteCond 规则参数介绍[通俗易懂]
Apache中 RewriteCond语句对于我来说一直是个难点,多次试图去把它搞明白,都没有结果,这次我终于算大概知道它的意思了。 RewriteCond就像我们程序中的if语句一样,表示
全栈程序员站长
2022/06/29
4.7K0
对Unity的Resources目录进行改名
项目用的是Unity5.5版本,开发的时候将相关的图集、预制对象资源都放在 Resources 目录下,而真机使用的是 StreamingAssets 目录下的资源。
meteoric
2018/11/20
1K0
apache rewritecond_hfile数据格式中的data字段用于
RewriteCond就像我们程序中的if语句一样,表示如果符合某个或某几个条件则执行RewriteCond下面紧邻的RewriteRule语句,这就是RewriteCond最原始、基础的功能,为了方便理解,下面来看看几个例子。
全栈程序员站长
2022/08/18
4.5K0
type 别名
在 TypeScript 中,type 关键字用于创建类型别名(Type Aliases)。类型别名允许你为一个具体的类型或类型组合定义一个名称,以便在代码中重复使用。
程序员王天
2023/10/18
1730
MySQL 别名
语法二(取别名关键字 as): select 函数名 as 别名 from 表名; ##中文别名需要用引号 引起来 ##中间有空格的别名 例如 avg m 需要加引号 ‘avg m’
指剑
2022/07/17
1.7K0
Laravel Bash 别名
Bash 别名是让你用更难忘的单词、缩写或者字符引用来另一个命令的方式。 例如,如果你使用 Git,你可能会在一天内运行很多次 git status,而为了节省时间和按键的次数,你可以将 git status 命名为 gs,它自动继承和调用正确的命令。 这些年我看到很多与众不同的的别名,每个人都是独一无二的。 也许你会对我用的快捷键感到迷惑,甚至会觉得不可思议的。「咦?有这种命令么?」 诸如此类的事情,而这可能正是别名好玩的地方。(我就喜欢看你一脸懵 B 再一副觉得好神奇的样子) 我请社区的人和我分享他们的
overtrue
2018/07/05
1.8K0
Python 之 不同目录间进行模块调用
不同目录间进行模块调用 main.py 调用 login.py 1、编写main.py主程序文件 #Author Kang import os import sys # print(sys.pat
py3study
2020/01/10
6530
Python 之 不同目录间进行模块调用
RewriteCond指令格式
语法: RewriteCond TestString CondPattern [flags]
全栈程序员站长
2022/07/01
2.5K0
Apache rewrite Url
本文主要介绍Apache环境下,如何使用mod_rewrite模块完成URL重写功能。
黄啊码
2020/05/31
1.8K0
(九)路由别名
路由别名,给不同路径渲染同一组件 说明 我们有时候需要用不同的名字来渲染相同的组件,这个时候就需要用到路由别名了 都渲染成根路由 通过 alias 来设置别名 { path: '/', // 这里有参数,别名也需要有参数 path: '/:postsId', component: BlogListPage, // 可以设置单个 alias: '/posts' // 也可以通过数组形式设置多个 alias: ['/posts', '/blogs'] // 如果pat
老怪兽
2023/02/22
1.3K0
(九)路由别名
PHP对目录下的子目录及文件进行压缩并解压
创建压缩类文件 zip.php <?php class Zip{ /** * Zip a folder (include itself). * Usage: * Zi
Action
2021/05/07
1.8K0
PHP对目录下的子目录及文件进行压缩并解压

相似问题

对子查询使用别名

12

对子目录列表进行排序

10

对子域使用mod_rewrite

30

别名和mod_rewrite

20

对子查询的别名使用where条件

27
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文