RewriteRule基于HTTP_REFERER重定向到子目录

时间:2014-03-11 04:56:10

标签: apache .htaccess mod-rewrite redirect

我遇到一个问题,其中wordpress安装从/(root)移动到/beta/(子目录)。我有很好的工作,除了有一些链接到的页面链接,例如,/my-page现在是404,我希望它重定向到/beta/my-page/beta/(.*)路径上的这些链接存在,因此我的想法是在主根路径中生成.htaccess规则,该路径会看到链接来自/beta/*和只需将用户重定向回正确的页面即可。这就是我到目前为止所做的:

RewriteEngine On
# `HTTP_REFERER` contains my beta path...
RewriteCond %{HTTP_REFERER} /march\-beta
# The current page is not *already* a `/march-beta` page (don't want an infinite redirect)
RewriteCond %{REQUEST_URI} !/march\-beta
# Remap the entire path to be in the correct subdirectory
RewriteRule ^(.*)$ /march-beta$1 [R=302, L]

然而......当我将文件保存在服务器的webroot中时,我收到了500服务器配置错误的错误。

一个例子:

如果用户在/march-beta/t-shirts

并点击链接到/blue-t-shirts(或甚至/t-shirts/blue-ones)的链接

我希望.htaccess文件看到HTTP_REFERER包含/march-beta,并立即R=302他们到/march-beta/blue-t-shirts(或/march-beta/t-shirts/blue-ones,第二种情况)。

1 个答案:

答案 0 :(得分:1)

您收到500服务器错误,因为您的重写标记之间有空格。这个空格让mod_rewrite认为标志是[R=302,,并且可怕地混淆mod_rewrite并抛出错误。尝试删除空格:

RewriteRule ^(.*)$ /march-beta$1 [R=302,L]

此外,您可能希望在/march-beta之后使用斜杠,因为在htaccess文件中重写规则的URI会删除前导斜杠:

RewriteRule ^(.*)$ /march-beta/$1 [R=302,L]