0

这些年来我经常使用 mod_rewrite 规则,这更让我不明白为什么这不起作用:

RewriteRule ^cottage/house/(.*)/(.*)$ /cottage/house/$1?query=$2 [L]

我将它与以下 .htaccess 文件一起使用:

RewriteEngine On

Rewritecond %{HTTP_HOST} !^www\.website\.com
RewriteRule (.*) http://www.website.com/$1 [R=301,L]

RewriteBase /
RewriteRule ^index\.php$ - [L]

# uploaded files
RewriteRule ^([_0-9a-zA-Z-]+/)?files/(.+) wp-includes/ms-files.php?file=$2 [L]

# add a trailing slash to /wp-admin
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule  ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
RewriteRule  ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
RewriteRule . index.php [L]

此代码应该使格式的 URL/cottage/house/housename/about转到/cottage/house/housename?query=about...任何想法将不胜感激。

4

2 回答 2

0

当单独使用时,该规则非常有效。

问题是[L]规则中的 仅意味着在此处理步骤中不再处理此规则集(.htaccess 文件)中的规则。

但是,重写后的 URL/cottage/house/housename?query=about会返回给 URL 解析引擎。由于匹配规则导致内部重定向,URL 将被规则集再次处理(作为子请求)。

我猜不存在真正的文件或目录匹配/cottage/house/housename?query=about,并且我还假设此 URL 不会被其他规则捕获。这将导致规则RewriteRule . index.php [L]匹配,从而导致另一个子请求,这一次index.php将显示索引页面。这就是为什么看起来该规则似乎无法正常工作的原因。

如何解决这个问题?

确保第一个子请求被常规规则捕获。实际RewriteRule情况取决于您的整体 URL 结构的外观,以及哪些其他规则(示例代码中未给出)处于活动状态。

于 2012-07-21T22:25:19.763 回答
0

我设法解决了这个问题——Wordpress 有自己的处理方式mod_rewrite

下面的代码以 Wordpress 理解的方式在内部重写了 URL:

function ong_custom_house_pages() 
{
    function add_query_vars($houseVars) 
    {
        $houseVars[] = "current_house_page"; 
        return $houseVars;
    }
    add_filter('query_vars', 'add_query_vars');
    add_rewrite_rule("^houses/([^/]+)/([^/]+)/?",'index.php?
    houses=$matches[1]&current_house_page=$matches[2]','top');
}
add_action('init','ong_custom_house_pages');

希望这可以帮助任何有类似问题的人。

于 2012-08-11T10:39:18.047 回答