我在本地 Apache 副本上运行了一个虚拟主机。它有一个别名。
<VirtualHost 127.0.0.1>
ServerName oliverash.me.dev
DocumentRoot "/usr/docs/oliverash.me/public"
Alias /mayor "/usr/docs/uni/tmosct/public"
</VirtualHost>
这很好用。我可以通过oliverash.me.dev/mayor
浏览器中访问该别名。但是,我.htaccess rewrite
在该别名的文件夹中有一个简单的文件,它将所有内容(文件夹除外)重写到 index.php 页面。此重写工作正常。
尽管重写正在工作,但重写会返回 404 Not Found 错误。例如,如果我转到oliverash.me.dev/mayor/abcdefg
,它会重写到文件index.php
,但我收到此错误:
“该服务器上未找到所请求的 URL /usr/docs/uni/tmosct/public/index.php。”
这个文件确实存在。我可以直接访问它。
当我使用相同的别名,但localhost
不仅仅是这个虚拟主机时,重写工作正常,index.php 返回实际文件,而不是 404。这让我认为这与我的虚拟主机的权限有关。所以我尝试在我的下面添加这个httpd-vhosts.conf
(没有成功):
<Directory "/usr/docs/oliverash.me/public">
AllowOverride All
Order allow,deny
Allow from all
</Directory>
localhost
这些设置与上使用的设置相同DocumentRoot
,所以我不明白为什么它没有帮助。
更新:
所以我检查了 Apache error_log。结果发现这个别名的重写实际上是相对于这个虚拟主机的文档根目录的。
[Fri Jan 06 22:30:57 2012] [error] [client 127.0.0.1] File does not exist: /usr/docs/oliverash.me.dev/usr
这次重写实际上是在查找/usr/docs/oliverash.me.dev/public/usr/docs/uni/tmosct/public
index.php。希望很明显它应该在查找/usr/docs/oliverash.me.dev
。
更新2:
好的,这是我在 Apache 的本地副本中遇到的问题。但是,我刚刚在实时 Web 服务器上遇到了完全相同的别名问题。这没有使用任何类型的虚拟主机。
[Sat Jan 07 02:41:51 2012] [error] [client 86.11.223.135] File does not exist: /var/www/html/var
再次强调,该路径是相对于 DocumentRoot 的。它应该是绝对路径。
有点烦人 :(
更新 3:
这正是我遇到的问题,但也许表述得更好:http://forums.devshed.com/apache-development-15/rewritebase-alias-and-rewriterule-are-not-rooting-to-required-file-395917.html
答案1
解决方案:RewriteBase 必须与 Alias 定义相同,而不是文件系统中的物理路径/目录!
检查RewriteBase
mod_rewrite 的指令,听起来可能与此有关。请参阅:http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewritebase
编辑1:
为了尝试这一点,我在 VMware 中设置了一个全新的 Ubuntu,一个全新的 apache2 安装,并在正常路径之外创建了一个新文件夹,然后设置了一个 .htaccess,并使其使用适当的规则工作RewriteBase
。默认的 DocumentRoot 是 /var/www,我在其中放置了一个 index.php 只是为了显示我的位置。它回显“默认情况下我是 index.php!”。然后我在 Apaches 配置中创建了这个别名:
Alias /testberg /home/www/testberg
<Directory "/home/www/testberg">
Options +Indexes
AllowOverride All
</Directory>
然后我在其中添加了另一个 index.php,内容是“我是 testberg 中的 index.php!”。在 /home/www/testberg 下,我创建了一个 .htaccess,内容如下:
RewriteEngine On
RewriteBase /testberg
RewriteRule ^apa.test$ index.php
当我浏览到http://192.168.100.183/testberg/apa.test我现在看到:“我是 testberg 中的 index.php!”并且 Apaches 日志文件等中没有错误。
这难道不是你想要实现的吗?
编辑2:
尝试使用不同的虚拟主机。在我的 Windows 桌面上,我将 ahntest.net 指向我的 VMware IP c:\windows\system32\drivers\etc\hosts
。在我的 VMware 服务器上,我创建/home/www/ahntest.net
并放置了一个修改后的 index.php 以回显“我是 ahntest.net 中的 index.php!”并创建了以下虚拟主机:
<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName ahntest.net
DocumentRoot /home/www/ahntest.net
Alias /testberg /home/www/testberg
<Directory "/home/www/testberg">
Options +Indexes
AllowOverride All
</Directory>
</VirtualHost>
浏览至http://ahntest.net给出“我是 ahntest.net 中的 index.php!”,浏览到http://ahntest.net/testberg给出“我是 testberg 中的 index.php!”,最后浏览到http://ahntest.net/testberg/apa.test给我“我是 testberg 中的 index.php!”所以据我所知,它在这里也运行良好。编辑 2 中的 .htaccess/patch 与上面编辑 1 中的相同。
答案2
您需要的是别名目标的目录容器
<Directory "/usr/docs/uni/tmosct/public">
...
</Directory>
更新
您必须将 Directory 容器放入 VirtualHost 容器内,以便它们可以为虚拟主机工作。
更新2
快速检查 jsFiddle 的东西,你需要一个
NameVirtualHost *:80
容器上方,接下来你应该重写
<VirtualHost 127.0.0.1>
进入
<VirtualHost *:80>
最后,您需要在 hosts 文件中添加一个条目,以便可以解析 URL。