【问题标题】:.htaccess RewriteRule skip URI that has query params.htaccess RewriteRule 跳过具有查询参数的 URI
【发布时间】:2017-10-04 21:30:14
【问题描述】:

我正在尝试从

重新路由本地 wordpress 实例(由 MAMP 运行)上的所有流量

localhost:8080/mydomainlocalhost:8080/mydomain/dashboard 有一个例外。如果 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

更新

Albert 的回答非常有效。现在我实际上将网站托管在服务器上。域名地址是这样的:

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]

可能是什么问题?

【问题讨论】:

  • 你能给我们精确的匹配标准吗 param1=2&param2=3 是 param1 和 param2 总是一样的,值呢?如果您说重新路由,您的意思是重定向(URL 将在浏览器中更改)或重写(URL 保持不变)但在内部其他一些目录正在处理请求?
  • @Webdesigner 我添加了参数。其中之一会改变。我实际上想重定向到另一个地址而不是重写 url。
  • 但它总是排在第二位,对吧?而dashboard是mydomain的一个子文件夹,安装了wordpress的东西?
  • 是的,是的
  • 查询参数会改变还是查询参数的值会改变?例如 post_type=other_product&t=23&preview=5 如果你有 localhost:8080/mydomain/foo 这也应该去 localhost:8080/mydomain/dashboard/foo

标签: apache .htaccess mod-rewrite mamp


【解决方案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,则第一个条件可防止无限循环,第二个条件排除具有该查询字符串的 URL 以获取 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]

【讨论】:

  • 这很好用,但由于某种原因,它删除了我网站上的自定义样式。
  • 您的意思是 Wordpress 的自定义样式?我不是专家,但我想他们在数据库中保存了完整的 URL,也许您还必须为他们的文件或文件夹添加例外(只需添加类似于第一个的另一个条件)。
  • 就是这样!!!!谢谢你。我刚刚为资源(image/css/js)来自的子文件夹添加了条件。
  • 当我把它放在服务器上并且我的域看起来像 www.mydomain.com 那么我该如何翻译呢?
  • Alberto,你能看看我的更新并提供一些帮助
【解决方案2】:

因此,如果您愿意,可以在您的 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>

此版本对您的查询字符串尽可能灵活,但如果您希望使用固定值,只需根据需要进行更改。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-16
    • 1970-01-01
    • 2013-12-21
    • 2019-09-19
    • 1970-01-01
    相关资源
    最近更新 更多