.htaccess RewriteRule跳过具有查询参数

时间:2017-10-04 21:30:14

标签: apache .htaccess mod-rewrite mamp

我试图从本地wordpress实例(由MAMP运行)重新路由所有流量

localhost:8080/mydomainlocalhost:8080/mydomain/dashboard,但有例外。如果URI具有如下查询参数,我不想重新路由URI:

localhost:8080/mydomain/?post_type=ignition_product&p=23&preview=1。查询参数p将更改。

我已经阅读了In Depth Guide to mod-rewrite,但我仍然遇到问题。

我做了一次尝试,但我认为这是一个残酷的错误:

// done by wordpress
# BEGIN WordPress
<IfModule mod_rewrite.c>

RewriteEngine On
RewriteBase /mydomain/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /fundblack/index.php [L]

// added by me
RewriteCond ...need help here trying to ignore if there are query params... 
RewriteRule ^mydomain/?(\w+)$ - [L]

RewriteRule ^mydomain/$ mydomain/dashboard
</IfModule>

# END WordPress

更新

艾尔伯特的答案非常有效。现在,我实际上是在服务器上托管该网站。域名地址是这样的:

subdomain.subdomain.mydomain.com

只是做了这件事,但它不起作用:

RewriteBase /
RewriteCond %{REQUEST_URI} !^/dashboard.* [NC]
RewriteCond %{REQUEST_URI}%{QUERY_STRING} !^/post_type=ignition_product&p=.*&preview=1$ [NC]
RewriteRule ^(.*)$ dashboard/$1 [R=301,L]

可能是什么问题?

2 个答案:

答案 0 :(得分:1)

您没有两个重写规则,只有.htaccess /mydomain/RewriteBase /mydomain/ RewriteCond %{REQUEST_URI} !^/mydomain/dashboard.* [NC] RewriteCond %{REQUEST_URI}%{QUERY_STRING} !^/mydomain/post_type=ignition_product&p=.*&preview=1$ [NC] RewriteRule ^(.*)$ dashboard/$1 [R=301,L] 文件夹中的两个条件:

localhost:8080/mydomain/dashboard/anything

如果您尝试直接访问p,则第一个条件会阻止无限循环,第二个条件会为?参数的任何值排除带有该查询字符串的网址(请注意缺少%{REQUEST_URI}%{QUERY_STRING} }不是拼写错误,因为它不包含在撰写的/mydomain/)中。

此外,由于您之前拥有RewriteBase /mydomain/,因此您不需要在规则中使用RewriteBase

修改:要将其放入最终域名,请删除/,因为不需要,并将.htaccess直接放入规则中(我在第一个答案中使用它)因为您已在原始RewriteCond %{REQUEST_URI} !^/dashboard.* [NC] RewriteCond %{REQUEST_URI}%{QUERY_STRING} !^/post_type=ignition_product&p=.*&preview=1$ [NC] RewriteRule ^(.*)$ /dashboard/$1 [R=301,L] 中定义了它:

{{1}}

答案 1 :(得分:0)

因此,在您的WP Direcory /mydomain/dashboard中,如果您愿意,只需放置一个通用的WP .htaccess文件。

# BEGIN WordPress
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /mydomain/dashboard/
    RewriteRule ^/?mydomain/dashboard/index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . index.php [L]
</IfModule>
# END WordPress

但是在/mydomain文件夹中,您将以下内容放在htaccess中:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{QUERY_STRING} !^post_type=([^&]+)&([^=]+)=([^&]+)&preview=([^&]+)$
    RewriteCond %{REQUEST_URI} ^/?mydomain/?$ 
    RewriteRule ^/?mydomain(/.*)?$ /mydomain/dashboard$1 [R=301,L]
</IfModule>

此版本对于您的查询字符串非常灵活,但如果您希望拥有固定值,只需根据需要进行更改。

<IfModule mod_rewrite.c></IfModule>在两种情况下都是可选的,但如果禁用mod_rewrite,它将保护您免受任何服务器错误的影响。