通过2个网址访问的.htaccess内容始终重定向到第一个网址

时间:2012-01-25 22:22:04

标签: apache .htaccess mod-rewrite redirect

所以我有一个奇怪的服务器设置,我没有很多控制权。我的生产网站看起来像这样:

/www/users/name    <- server points here
    /public    <- I want it to point here, but I don't have that option
        index.php    <- all requests should eventually end up here

可以通过 www.test.com/users/name www.test.com/~name

访问

我的开发网站看起来像这样:

/www/name/public    <- dev server points here
    index.php    <- all requests should eventually end up here

只能通过 www.test.dev

访问

我正在使用一个PHP框架,它强制我的网址总是有相同的基础才能工作(Laravel)。所以 www.test.com/~name/stuff 会起作用,但 www.test.com/users/name/stuff 将无效。我希望我的网址始终以前者的身份出现,以解决这个问题。

我为我的生产基础目录创建了一个.htaccess文件,它总是会转发到这样的公共目录:

    RewriteEngine on

    RewriteRule ^(.*)$ public/$1

公共目录有一个这样的.htaccess文件,它附带了我正在使用的框架(由于我的开发网站工作得很好,我不想改变它):

    RewriteEngine on

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d

    RewriteRule ^(.*)$ index.php/$1 [L]

只有这样,所有 / ~name 请求都能正常运行,但 / users / name 都不起作用。 如何修复我的生产基础目录.htaccess文件以强制从/ users / name到/〜name的所有请求?

我尝试过添加:

RedirectMatch ^/users/name/(.*)$ /~name/$1

哪个不起作用,因为重写被揭示。例如,如果我要求 www.test.com/~name/stuff ,则显示为 www.test.com/~name/public/index.php/stuff 。没有RedirectMatch行,所有~name请求都可以正常工作。

奇怪的是,如果我将上述规则交换为:

RedirectMatch ^/~name/(.*)$ /users/name/$1

除了我的网址总是有 / users / name 而不是 /〜name 之外,所有内容都很完美。

显然,如果我的要求不可能,我愿意接受这个。如果有人可以解释为什么上面的工作,但前一个工作没有那么好。我确实发现我可以通过将 RedirectBase / ~name 添加到BOTH .htaccess文件来获得第一个工作,但正如我上面提到的,我不想更改公共.htaccess文件,因为两者都是我的开发和生产环境使用它。

提前致谢!

1 个答案:

答案 0 :(得分:0)

以下适用于我:

RewriteEngine on

RewriteBase /~name    

RewriteCond %{REQUEST_URI} /users/name(.*)
RewriteRule ^(.*)$ $1 [L,R]

RewriteRule ^(.*)$ public/$1

仍然不确定为什么这样做以及我上面描述的内容不...猜测:我认为这与RedirectMatch重定向发生时有关。在这个版本中,我强制重定向从/ users / name到/ ~name总是先发生,然后再发生任何其他重写。我相信上面RedirectMatch的重定向发生在另一个Rewrites之后,这就是重写出现在地址栏中的原因。我还认为在另一个方向上的Redirect运行正常,因为实际路径/ users / name很可能是/〜name的别名。所以它必须在一个案例中用/ users / name替换/〜name,而不是在另一个案例中。