我有一个重写规则在OSX(MAMP堆栈)上按预期工作,但在Ubuntu上有效。重写规则如下:
DirectoryIndex index.php
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /api
RewriteRule ^$ index.php [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>
<IfModule mod_php5.c>
php_flag display_errors On
</IfModule>
目标是让像http://server.com/api/foobar这样的URL将foobar作为变量传递给index.php脚本。 Apache的版本有所不同:
我知道这会在httpd.conf中强加一些温和的语法更改,但这就是我在Ubuntu中所拥有的:
AccessFileName .htaccess
Alias /api "/home/ubuntu/repos/api"
<Directory "/home/ubuntu/repos/api">
DirectoryIndex index.php
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
当我在浏览器中输入http://server.com/api/index.php/resources时,我得到了正确的回复,但当我尝试使用重定向并输入http://server.com/api/resources时,它只响应403:Forbidden
(还有服务器) error_log没有错误输入)。
我还注意到,使用http://server.com/api/.htaccess直接访问.htaccess
文件会在error_log中触发错误:
[authz_core:error] [pid 10351:tid 139991464257280] [client x.y.z.w:60300] AH01630:服务器配置拒绝客户端:/home/ubuntu/repos/api/.htaccess
UPDATE :现在解释了这个最后一个错误...有一个指令阻止用户查看他.htaccess文件...这是合适的。我确实暂时将其关闭,看它是否有所帮助,但事实并非如此。
我检查了文件系统上的文件持久性,一切看起来都很好。必须是一个apache配置问题,但我拉着我的头发试图搞清楚。
-----更新------
目录权限:
文件权限:
答案 0 :(得分:0)
Occam's razor表示最好的答案不可避免地是最简单的答案。啊,昨天,当我把头靠在墙上时,这种智慧在哪里。无论如何,我已经解决了我的问题,我会在这里发布它作为一个简单的清单项目来寻找,如果你遇到像我这样的问题......
对我来说,Ubuntu上的Apache服务器超过了2.4阈值,这确实改变了一些指令语法。对于从2.4之前到2.4之后的任何人,请确保将对Order all,deny
的引用更改为Required all granted
。这是一个很好的步骤,但我遇到的问题是多余的。
现在真正的问题...如果重写不起作用且没有产生错误,请检查httpd.conf
文件(或者您的主要Apache conf文件是什么)并验证重写的LoadModule是否已取消注释:
LoadModule rewrite_module modules/mod_rewrite.so
太傻了,但确实耗费了我几个小时。希望它不会对你做同样的事。