为什么RewriteRule中的连字符在子文件夹中会中断

时间:2009-06-30 14:28:14

标签: apache .htaccess mod-rewrite

我在.htaccess中有一堆RewriteRules用于搜索引擎优化目的。样品...

RewriteEngine On 
RewriteRule ^signup$ /signup.php
RewriteRule ^account$ /account.php
RewriteRule ^logout$ /logout.php
RewriteRule ^login$ /login.php
RewriteRule ^recent-questions$ /recent.php
RewriteRule ^popular-questions$ /popular.php
...
...
 (more similar stuff)
...
...
RewriteRule ^(.*)/([-_~*a-zA-Z0-9]+)\|([0-9]+)(\/)?$ view.php?title=$1&id=$2&%{QUERY_STRING}
RewriteRule ^([-_~*a-zA-Z0-9]+)(\/)?$ categories.php?key=$1

系统位于服务器上的“ask”子文件夹中。

如果我将文件夹映射到http://ask.mydomain.com

,它们都可以正常工作

但我不想使用子域,因为我正在添加一个现有的标题&由共享资源的其他人管理的页脚,包含与主www的相对链接。网站。

当我尝试通过http://www.mydomain.com/ask访问该文件夹时,带有连字符的RewriteRules会导致404错误 - 其他错误继续有效。

我已经尝试将连字符转义为 - 和%2D。前者没有区别。后者将我带到一个完全不正确的页面。

2 个答案:

答案 0 :(得分:1)

解决方案 - 根本不是连字符。

这是因为MultiViews已启用www。域名,但不是问。域

/ signup将使用MultViews默认行为映射到/signup.php,

但是

/ recent-question未映射到recent.php

根据问题。子域名在.htaccess中重写正确处理的子域名。但MultiViews在www下打破了它。域。

答案 1 :(得分:0)

对我而言,您似乎正在替换错误的群体:

RewriteRule ^(.*)/([-_~*a-zA-Z0-9]+)\|([0-9]+)(\/)?$ view.php?title=$2&id=$3&%{QUERY_STRING}
如果我正确理解您的网址格式为mydomain.com/bla/title|id

,则应该