多年来我一直使用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]
此代码应使格式/cottage/house/housename/about
的网址转到/cottage/house/housename?query=about
...我们将非常感谢任何想法。
答案 0 :(得分:0)
当单独使用时,规则运作良好。
问题是规则中的[L]
仅表示在此处理步骤中不再处理来自此规则集(.htaccess文件)的规则。
但是,重写的URL /cottage/house/housename?query=about
将被传回URL解析引擎。由于匹配规则导致内部重定向,因此URL将再次由规则集处理(作为子请求)。
我猜不存在匹配/cottage/house/housename?query=about
的真实文件或目录,我还假设此URL不会被其他规则捕获。这将导致规则RewriteRule . index.php [L]
匹配,从而导致另一个子请求,这次是index.php
,然后将显示索引页面。这就是看起来规则似乎无法正常工作的原因。
如何解决这个问题?
确保第一个子请求被常规规则捕获。实际RewriteRule
取决于您的整体网址结构的样子,以及您的示例代码中未提供的其他规则是否有效。
答案 1 :(得分: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]¤t_house_page=$matches[2]','top');
}
add_action('init','ong_custom_house_pages');
希望这有助于任何有类似问题的人。