![为什么 RewriteBase 不起作用?](https://linux22.com/image/572640/%E4%B8%BA%E4%BB%80%E4%B9%88%20RewriteBase%20%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8%EF%BC%9F.png)
以下是我想做的事情:
- 域名是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”=“查询字符串附加”。)
我写得是不是太多了?:)