在我的主公共目录中,我有这个.htaccess文件,但访问/register
时出现404错误。
Options +FollowSymlinks
RewriteEngine On
RewriteRule ^register$ register.php
有了这个,我想让访问/register
的任何人使用/register.php
。我确定mod_rewrite
已启用且我的虚拟主机文件中存在AllowOverride All
。
有谁知道我怎么解决这个问题?我得到的只是The requested URL /register was not found on this server.
虚拟主机:
<VirtualHost *:80>
ServerAdmin my@email.com
ServerName my.site.com
DocumentRoot /home/mark/public
<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
<Directory /home/mark/public>
Options All MultiViews ExecCGI
AllowOverride All
Order allow,deny
allow from all
</Directory>
ErrorLog /home/mark/logs/public_error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog /home/mark/logs/public_access.log combined
</VirtualHost>
答案 0 :(得分:1)
<Directory /home/mark/public>
Options All MultiViews ExecCGI
AllowOverride All
Order allow,deny
allow from all
</Directory>
您需要将关闭 MultiViews:
Options All -MultiViews ExecCGI
它正在搞乱可选的内容协商。从apache文档:
如果服务器收到/ some / dir / foo的请求并且/ some / dir / foo不存在,那么服务器会读取名为foo。*的所有文件的目录,并有效地伪造一个类型映射,命名所有这些文件,为它们分配相同的媒体类型和内容编码,如果客户端通过名称请求其中一个文件。然后它选择与客户要求的最佳匹配,并返回该文档。
如果您要将/register
重写为/register.php
,则不要让MutliView在达到重写规则之前解决问题。
答案 1 :(得分:0)
这对我有用:
的/ etc / apache2的/网站启用/ 000-默认
<VirtualHost *:80>
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>
/var/www/.htaccess
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} ^/register$
RewriteRule ^(.*)$ register.php [NS,L]
编辑:添加了DocumentRoot / var / www