首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >mod_rewrite对子目录进行别名

mod_rewrite对子目录进行别名
EN

Stack Overflow用户
提问于 2011-07-21 14: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
运行
复制
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
运行
复制
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
运行
复制
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 17:52:01

就这么简单:

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

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

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

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

因此,.htaccess将如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
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 22:54:20

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

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

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

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

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

要改写为:

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

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

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

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

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

重定向

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

至:

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

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

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

溶液

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

代码语言:javascript
代码运行次数:0
运行
复制
# 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
运行
复制
$req_uri = $_SERVER['REQUEST_URI'];

我把它改成了这个

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

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

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

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

代码语言:javascript
代码运行次数:0
运行
复制
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

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档