简单的mod_rewrite规则不起作用

时间:2012-09-27 20:38:38

标签: apache mod-rewrite

在我的主公共目录中,我有这个.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>

2 个答案:

答案 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