我一直在尝试让我的.htaccess
文件在我的本地主机上工作。我知道该文件可以工作,因为它在我的服务器上并且可以工作。但它似乎在本地不起作用。
我已经按照我能找到的教程设置了所有覆盖,下面是我的/etc/apache2/sites-available/default
文件开始:
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www
<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
<Directory /var/www/>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
这是我的半字节站点同一目录中的代码:
<VirtualHost *:80>
ServerName nibble.local
DocumentRoot /var/www/nibble_framework/web/
<Directory /var/www/nibble_framework/web/>
AllowOverride All
Options Indexes FollowSymLinks MultiViews
Allow from All
</Directory>
RewriteLog /var/www/rewrite.log
ErrorLog /var/log/apache2/error.log
</VirtualHost>
我已经使用 a2ensite 启用了该站点并重新启动了 apache。我还将该网站添加到我的主机文件中:
127.0.0.1 nibble.local
我已经使用 a2enmod 启用了 mod 重写,并多次重新启动/重新加载 apache。
$ a2enmod rewrite
Module rewrite already enabled
我的.htaccess
文件已/var/www/nibble_framework/web/.htaccess
包含以下代码:
Options +FollowSymLinks +ExecCGI
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]*)/?.*$ - [E=FILE:%{DOCUMENT_ROOT}/$1.php]
RewriteCond %{ENV:FILE} !^$
RewriteCond %{ENV:FILE} -f
RewriteRule ^([^/]*)/?(.*)$ $1.php?url=$2 [QSA,L]
RewriteCond %{ENV:FILE} !^$
RewriteCond %{ENV:FILE} !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
</IfModule>
当我执行 a 时print_r($_REQUEST)
,即使 url 由长字符串填充,它也始终是一个空数组。
有谁知道为什么这可能会失败?
编辑:
Apache2访问日志:
~$ tail -f /var/log/apache2/access.log
::1 - - [16/Aug/2011:07:32:39 +0100] "OPTIONS * HTTP/1.0" 200 152 "-" "Apache/2.2.16 (Ubuntu) (internal dummy connection)"
::1 - - [16/Aug/2011:07:32:39 +0100] "OPTIONS * HTTP/1.0" 200 152 "-" "Apache/2.2.16 (Ubuntu) (internal dummy connection)"
::1 - - [16/Aug/2011:07:32:39 +0100] "OPTIONS * HTTP/1.0" 200 152 "-" "Apache/2.2.16 (Ubuntu) (internal dummy connection)"
::1 - - [16/Aug/2011:07:32:40 +0100] "OPTIONS * HTTP/1.0" 200 152 "-" "Apache/2.2.16 (Ubuntu) (internal dummy connection)"
::1 - - [16/Aug/2011:07:32:40 +0100] "OPTIONS * HTTP/1.0" 200 152 "-" "Apache/2.2.16 (Ubuntu) (internal dummy connection)"
::1 - - [16/Aug/2011:07:32:40 +0100] "OPTIONS * HTTP/1.0" 200 152 "-" "Apache/2.2.16 (Ubuntu) (internal dummy connection)"
::1 - - [16/Aug/2011:07:32:40 +0100] "OPTIONS * HTTP/1.0" 200 152 "-" "Apache/2.2.16 (Ubuntu) (internal dummy connection)"
::1 - - [16/Aug/2011:07:32:40 +0100] "OPTIONS * HTTP/1.0" 200 152 "-" "Apache/2.2.16 (Ubuntu) (internal dummy connection)"
::1 - - [16/Aug/2011:07:32:40 +0100] "OPTIONS * HTTP/1.0" 200 152 "-" "Apache/2.2.16 (Ubuntu) (internal dummy connection)"
::1 - - [16/Aug/2011:07:32:40 +0100] "OPTIONS * HTTP/1.0" 200 152 "-" "Apache/2.2.16 (Ubuntu) (internal dummy connection)"
答案1
我怀疑您的 VirtualHost 没有得到正确处理,这将不会为获取请求设置 AllowOverride。首先你的/etc/hosts
文件应该是这样的..
127.0.0.1 localhost localhost.localdomain
127.0.1.1 nibble.local
其次,您必须为基于名称的虚拟主机设置该接口。您没有指定当前是否已设置。通常它在主 apache 配置中设置,我猜 ubuntu/debian 已经找到了该文件/etc/apache2/apache2.conf
。确保该行已设置在该文件中的某个位置,
NameVirtualHost *:80
完成这些更改后,重新启动 apache
sudo /etc/init.d/apache2 restart
不,测试一下,记住您只在本地设置主机条目。因此,只有在本地主机请求时,这才会正确工作。如果您遇到困难,或者不起作用,请发布相关行/var/log/apache2/error.log
答案2
指定 AccessFileName 指令以使用.htaccess
文件。
AccessFileName .htaccess
启用重写引擎,然后重新启动服务。
sudo a2enmod rewrite