所以我有一个奇怪的服务器设置,我没有很多控制权。我的生产网站看起来像这样:
/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文件,因为两者都是我的开发和生产环境使用它。
提前致谢!
答案 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,而不是在另一个案例中。