我一直在和mod_rewrite做斗争。我们有许多客户端门户通过WordPress多站点运行,它们都是通过子目录portal
访问的。
例如:http://www.mydomain.com/portal/clientA/
我想通过输入http://www.mydomain.com/clientA/
就能到达那里,它会把我转到http://www.mydomain.com/portal/clientA/
到目前为止,我的情况是这样的,它并没有产生任何我能知道的重写:
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所在的位置:
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的正确答案!供其他人参考,我使用的最后解决方案是:
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
发布于 2011-07-21 09:52:01
就这么简单:
RewriteCond %{REQUEST_URI} !^/portal/
RewriteRule (.*) /portal/$1 [L]
它将重写(内部重定向)所有请求到/portal/
文件夹(例如,/clientA/something
=> /portal/clientA/something
)。
如果您只需要为某些客户端(或者更好地说,只针对特定的客户端文件夹,同时仍然有一些常规/公共文件夹)这样做,则可以对每个客户端使用此规则:
RewriteRule ^clientA(.*) /portal/clientA$1 [L]
因此,.htaccess将如下所示:
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
发布于 2012-11-21 14:54:20
我在这里发表了一些评论,但我认为,对于来到这里的人来说,这样做可能会更清楚一些。在操作点上,他找到了一种使用R行来实现该操作的方法,但是这消除了您创建的子目录URL结构,这在大多数URL重写中是可取的。所以,前面发布的答案是正确的,我并不反对,但取决于您的实现,您可能仍然会得到WordPress 404错误。这里有一个解决我的情况的办法,我认为这可能更常见。
在我的例子中,我需要这样的URL结构:
http://mysite.com/p/profile_name/
每个来注册的用户都可以动态创建他/她自己的配置文件,除了对内容进行几处修改之外,在大多数情况下,将显示根目录下的所有WordPress内容。基本上,我需要这个:
http://mysite.com/p/profile_name/(.*)
要改写为:
http://mysite.com/$1
这是发布在另一个答案中的.htaccess代码,它将正确地处理该规则:
RewriteRule ^p/([-a-zA-Z0-9_]+)(/.*) $2 [L]
这方面的问题是,WordPress在理解$2是什么方面并不关心您的重写,因为WordPress使用$_SERVER‘’REQUEST_URI‘,不管您要重写什么,都是用户浏览器窗口中的内容。OP通过使用R选项找到了绕过这一问题的方法,但这会导致您丢失URL:
RewriteRule ^p/([-a-zA-Z0-9_]+)(/.*) $2 [R,L]
重定向
http://mysite.com/p/profile/(.*)
至:
http://mysite.com/$1
但是,用户以这种方式丢失了他唯一的URL。充其量,您可以添加一个查询字符串,以至少保留数据,但这样就失去了漂亮URL的意义。
我确实想出了一个解决方案;然而,它涉及黑客WordPress包含文件:(如果有人有更好的方法,请更新。我们开始:
溶液
我将我的.htaccess文件设置为:
# 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):
$req_uri = $_SERVER['REQUEST_URI'];
我把它改成了这个
$req_uri = preg_replace(@'/^\/?p\/([-a-zA-Z0-9_]+)\//', '', $_SERVER['REQUEST_URI']);
这基本上只是通过过滤掉URI开头的概要文件来欺骗WordPress。
最后,我也需要一个解决方案,在网站内的链接。为此,我添加了一个过滤器:
注意事项:这些正则表达式中的一些可能有点疯狂;我是在过滤站点特定的内容,所以请将此作为一个概念,而不是复制/粘贴。
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是唯一重要的过滤器。无论如何,您需要内部链接到工作的代码。
我希望这会有所帮助,如果有人对此有任何意见,我将非常感谢。
https://stackoverflow.com/questions/6777779
复制相似问题