mod_rewrite规则和内容协商

时间:2009-01-14 20:46:24

标签: apache mod-rewrite content-negotiation

我对mod_rewrite相对较新,但有一个网站,我想拥有“漂亮的网址”。与SO类似:)。

我正在尝试这样的事情:“http://www.whatever.com/search/test”被重写为“http://www.whatever.com/search.php?q=test”并且取得了一些有限的成功。我相信内容谈判正在阻碍我......

对于初学者来说,这是我的测试.htaccess文件:

RewriteEngine on
RewriteBase /~user/mysite/

RewriteRule ^search$ search/ [R]
RewriteRule ^search/([^/]*)/?$ search.php?q=$1 [L]

不幸的是, 重定向到search.php,但是没有在q变量中传递我的参数。但是这个 工作:

RewriteEngine on
RewriteBase /~user/mysite/

RewriteRule ^search$ search/ [R]
RewriteRule ^search/([^/]*)/?$ s.php?q=$1 [L] # here i've renamed the search.php to s.php to dodge the content negotiation that is happening..

事实上,如果我一起删除规则,我得到的结果与文件的第一个版本相同。所以我的结论是,即使没有任何mod_rewrite规则,apache很乐意将“foo”重定向到“foo.php”,它必须是正在处理它的内容协商。 (如果我将我的foo.php重命名为foo.html,它仍然会找到该文件,如果我只是去“foo”),这进一步验证了这一点。

所以,问题是。如何在内容协商方面正确使用mod_rewrite?我可以为特定文件禁用它吗?有没有办法确保我的mod_rewrite规则在内容协商发生之前发生?

如果它是相关的,这里是我的apache conf的mod_userdir部分的conf文件(这个测试站点在我的用户的homedir / public_html中):

# Settings for user home directories

<IfDefine USERDIR>
<IfModule userdir_module>

# UserDir: The name of the directory that is appended onto a user's home
# directory if a ~user request is received.  Note that you must also set
# the default access control for these directories, as in the example below.
UserDir public_html

# Control access to UserDir directories.  The following is an example
# for a site where these directories are restricted to read-only.
<Directory /home/*/public_html>
    AllowOverride FileInfo AuthConfig Limit Indexes
    Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
    <Limit GET POST OPTIONS>
        Order allow,deny
        Allow from all
    </Limit>
    <LimitExcept GET POST OPTIONS>
        Order deny,allow
        Deny from all
    </LimitExcept>
</Directory>

# Suexec isn't really required to run cgi-scripts, but it's a really good
# idea if you have multiple users serving websites...
<IfDefine SUEXEC>
<IfModule suexec_module>
<Directory /home/*/public_html/cgi-bin>
    Options ExecCGI
    SetHandler cgi-script
</Directory>
</IfModule>
</IfDefine>

</IfModule>
</IfDefine>

1 个答案:

答案 0 :(得分:5)

在配置中查找此选项。

Options +Multiviews

它会寻找

/foo/test
/foo/
/foo

并将其重定向到

/foo.[any file]

基于它是否存在以及是否符合所请求的内容类型。

将选项更改为此选项可禁用此功能。

Options -Multiviews