Oli*_*Ash 2 mod-rewrite alias .htaccess virtualhost apache-2.2
我有一个虚拟主机在我的本地 Apache 副本上运行。它有一个别名。
<VirtualHost 127.0.0.1>
ServerName oliverash.me.dev
DocumentRoot "/usr/docs/oliverash.me/public"
Alias /mayor "/usr/docs/uni/tmosct/public"
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
这工作正常。我可以通过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>
Run Code Online (Sandbox Code Playgroud)
这些是在localhost's上使用的相同设置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
解决方案:RewriteBase 必须与 Alias 定义相同,而不是文件系统中的物理路径/目录!
检查RewriteBasemod_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>
Run Code Online (Sandbox Code Playgroud)
在那里我放了另一个 index.php 说“我是 testberg 中的 index.php!”。在 /home/www/testberg 下,我创建了一个包含以下内容的 .htaccess:
RewriteEngine On
RewriteBase /testberg
RewriteRule ^apa.test$ index.php
Run Code Online (Sandbox Code Playgroud)
当我浏览到http://192.168.100.183/testberg/apa.test 时,我现在看到:“我是 testberg 中的 index.php!” 并且 Apaches 日志文件等中没有错误。
这不是你想要完成的吗?
编辑 2:
尝试使用不同的虚拟主机。在我的 Windows 桌面上,我将 ahntest.net 指向了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>
Run Code Online (Sandbox Code Playgroud)
浏览http://ahntest.net给我“我是 ahntest.net 中的 index.php!”,浏览http://ahntest.net/testberg给我“我是 testberg 中的 index.php!” 最后浏览到http://ahntest.net/testberg/apa.test给了我“我是 testberg 中的 index.php!” 所以据我所知,它在这里也能正常工作。Edit 2 中的 .htaccess/patch 与上面 Edit 1 中的相同。
| 归档时间: |
|
| 查看次数: |
24678 次 |
| 最近记录: |