所以我的目录结构是这样的:
vhostrootdir/
|- app/
|- public/
|- css/
|- img/
|- js/
这是我的重写:
ServerName vhostname
<Directory "vhost/root/dir">
Options FollowSymLinks
AllowOverride None
Require local
RewriteEngine On
RewriteCond %{CONTEXT_DOCUMENT_ROOT}/public/$1 -f
RewriteRule ^((?s).*)$ public/$1 [END]
RewriteRule ^((?s).*)$ index.php?_url=$1 [END]
</Directory>
如果我转到vhostname/whatever
,那么我的php $_GET["_url"]
会返回whatever
,地址栏会根据需要保留vhostname/whatever
。
但是,如果我转到vhostname/public
,则$_GET["_url"]
为public/
。请注意额外的&#39; /&#39;,尽管这并不会让我感到困扰。 问题是浏览器地址栏也会更改为 vhostname/public/?_url=/public
,我绝对不想要。
如果我转到vhostname/public/
(请注意附加的&#39; /&#39;),这会让您感到困惑,那么它就能正常运行。我认为$_GET["_url"]
为public/
且地址栏无法更改。
如果我转到vhostname/app
,情况就是一样。
编辑: 原来这是一个浏览器历史记录问题。我清除了Chrome的历史并修复了它。没关系,没有解决它。将DocumentRoot更改为公用文件夹后,它仍然发生在公共和应用程序URL上,但随后清除它停止发生的历史记录,现在正在公用文件夹子文件夹中发生。
答案 0 :(得分:0)
请注意,您希望将DocumentRoot指向public /,因为app /不应通过网络访问。
在此示例中,设置空路径将导致_url == none,否则_url将包含添加的任何路径。
ServerName vhostname
DocumentRoot /vhost/root/dir/public
<Directory "/vhost/root/dir/public">
AllowOverride none
Require local
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^$ index.php?_url=none [NC,QSA,L]
# we need to serve static files
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# pass the path to _url
RewriteRule ^(.+)$ index.php?_url=$1 [NC,QSA,L]
</IfModule>
答案 1 :(得分:0)
好的,我相信我已经找到了问题。因为重写之前的URL正在解析为目录,并且因为我省略了尾随/
,所以apache会自动发送301 Moved Permanently重定向并添加尾随/
。我想由于订单apache做了一些事情,重定向也是重写,而不是301从http://<vhostname>/img
重定向到<vhostname>/img/
,它被301重定向到<vhostname>/img/?_url=img
。
我终于修复了这个(我认为),将DirectorySlash off
添加到我的虚拟主机中。