为什么 RewriteBase 不起作用?

为什么 RewriteBase 不起作用?

以下是我想做的事情:

  • 域名是thinkingmonkey.me
  • 域名的 IP 地址为 127.0.0.1
  • mod_alias已安装。

我有一个名为 的 conf 文件directories.conf。其中有与目录相关的所有配置。directories.conf包含在httpd.conf

我的directories.conf

Alias /runs /xhprof/xhprof_html

<Directory /mysite/xhprof/xhprof_html>
    Order allow,deny
    Allow from all
    AllowOverride All
</Directory>

/mysite/xhprof/xhprof_html/.htaccess。我有以下内容:

RewriteEngine on
RewriteBase /runs
RewriteRule  .*  index.php

我所做的只是将所有请求发送/mysite/xhprof/xhprof_html/index.php

当我请求thinkingmonkey.me/runs 没有尾部斜杠我明白了404 not found

因此,我推断这RewriteBase不起作用。
我做错了什么?

答案1

这里有几件事在起作用。首先,该Alias指令希望其右侧是服务器上的绝对物理路径:你想要

Alias /runs /mysite/xhprof/xhprof_html

<Directory /mysite/xhprof/xhprof_html>
    Order allow,deny
    Allow from all
    AllowOverride All
</Directory>

其次,RewriteRuleRewriteRule .* index.php不仅匹配http://.../runs,还匹配任何以 开头的 URL http://.../runs/,例如http://.../runs/css/...。有几种方法可以解决这个问题。

 

选项 1:你可以让 RewriteRule 只将运行的根重定向到 index.php:

    RewriteRule ^$ index.php
    RewriteRule ^/$ index.php

 

选项 2:你可以让你的 mod_rewrite 配置以文件形式存在的特殊情况,并将其他所有内容重定向到index.php

    # Require the path the request translates to is an existing file
    RewriteCond %{REQUEST_FILENAME} -f
    # Don't rewrite it, but do stop mod_rewrite processing
    RewriteRule .* - [L]

    # Now, redirect anything into index.php
    RewriteRule .* index.php

 

选项 3:你可以对某些 URL 进行特殊处理,并将其余内容重定向至index.php

    RewriteCond $1 !^css/
    RewriteCond $1 !^js/
    RewriteRule .* index.php

 

选项 4:如果您希望任何映射到目录的 URL 都显示文件index.php(如index.html),则有一种非常简单的方法,这可能就是您想要的。您可以将以下内容放在.htaccess<Directory>块内directories.conf

    DirectoryIndex index.php index.html

 

脚注:上面的 RewriteRules 基本上会丢弃最终映射到 的所有请求的所有 URL index.php。这包括查询字符串,因此/runs/?foo=bar与 相同/runs/。如果这不是您想要的,您需要一个类似

    RewriteRule ^(.*)$ index.php/$1 [QSA]

它保留了路径信息($1部分)和查询字符串(“QSA”=“查询字符串附加”。)

我写得是不是太多了?:)

相关内容