.htaccess 内部重定向不适用于字符串参数

Posted

技术标签:

【中文标题】.htaccess 内部重定向不适用于字符串参数【英文标题】:.htaccess internal redirect not working with string parameter 【发布时间】:2018-01-02 15:47:22 【问题描述】:

所以我已经处理了几个小时,但无法解决。 *** 上没有任何东西可以解决我的问题。问题是我的 .htaccess 中有一个重定向规则,如下所示

RewriteRule ^store-category/(.+)/?$ /wordpress/store-category/?cid=$1 [QSA,L]

当 cid 是数字时,此重定向有效,但当使用 "my-key" 之类的字符串时,它不起作用。用钥匙我必须把规则改成这个。

RewriteRule ^store-category/(.+)/?$ /wordpress/store-category/?cid=$1 [R,L]

但是我不想使用它,因为这会明显地重定向我的用户并且 url 会发生变化,这是我不想要的。谁能解释一下为什么这个东西适用于数字而不适用于字符串参数。任何帮助将不胜感激。

编辑:完成.htaccess

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /wordpress/
RewriteRule ^index\.php$ - [L]
RewriteRule ^store-category/(.+)/?$ /wordpress/store-category/?cid=$1 [QSA,L]
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule . /wordpress/index.php [L]
</IfModule>

# END WordPress

【问题讨论】:

这是您的 .htaccess 文件中的唯一规则吗? 能否请您发布 .htaccess 文件中的其他规则 通过查看一些看似正确的规则是不可能找到罪魁祸首的。您应该设置一个日志级别来检查发生了什么LogLevel rewrite:trace3 您能否从您的指令中确认您的.htaccess 文件的位置?我认为这是在/wordpress 子目录中? IE。 /wordpress/.htaccess? Wordpress CMS 系统不适用于重写规则。为此,您需要使用 Wordpress rewrite API。 【参考方案1】:

正则表达式是贪婪的(从左到右)。您可能会添加额外的斜线。我发现对 URL 使用 not 类是最简单的方法(很少使用 '.' 来匹配所有内容)。

RewriteRule ^store-category/([^\/]+)/?$ store-category/?cid=$1 [QSA,L]

您也可以对此进行简化,具体取决于您希望如何处理可能在商店类别 ID 之后格式错误的网址。

RewriteRule ^store-category/([^\/]+) store-category/?cid=$1 [QSA,L]

编辑:你是对的。我没有测试整个htaccess。您在 rewritebase 和规则中指定了两次 wordpress 路径。我已经更新了上面的规则,并在测试器中提供了更新解决方案的链接:

http://htaccess.mwl.be?share=116de701-cf8a-577c-bab5-5c357d844452

【讨论】:

这仍然不影响结果 非常感谢。但我没有写这个规则。我使用 wordpress 功能自动生成它。并且使用一个数字就可以了。所以我认为这与 wordpress 路径两次原因无关。【参考方案2】:

我在本地做了一些尝试,发现如果我设置这两条规则,它对我有用:

RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d

甚至在行之前

RewriteRule ^store-category/(.+)/?$ /wordpress/store-category/?cid=$1 [QSA,L]

完整的.htaccess 文件将是:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /wordpress/

RewriteRule ^index\.php$ - [L]

RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule ^store-category/(.+)/?$ /wordpress/store-category/?cid=$1 [QSA,L]

RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule . /wordpress/index.php [L]
</IfModule>

无论如何,使用(.+)/?$,将从组中捕获最终的尾部斜杠,并将继续使用cid 参数。如果分类里面没有斜线,最好使用([^/]+)/?$

更新:了解重定向时发生的情况,启用日志(请参阅http://httpd.apache.org/docs/current/mod/mod_rewrite.html fo this)。在我的主机上,我启用了mod_rewrite.c:trace3,并在error_log 中获得了以下登录信息(仅使用rewrite 跟踪行)

[Fri Aug 04 12:48:56.904099 2017] [rewrite:trace3] [pid 22823:tid 140368028878592] mod_rewrite.c(477): [client ::1:58312] ::1 - - [localhost/sid#788520][rid#7fa9e4002970/initial] [perdir /var/www/localhost/htdocs/wordpress/] strip per-dir prefix: /var/www/localhost/htdocs/wordpress/store-category/my-id -> store-category/my-id
[Fri Aug 04 12:48:56.904123 2017] [rewrite:trace3] [pid 22823:tid 140368028878592] mod_rewrite.c(477): [client ::1:58312] ::1 - - [localhost/sid#788520][rid#7fa9e4002970/initial] [perdir /var/www/localhost/htdocs/wordpress/] applying pattern '^index\\.php$' to uri 'store-category/my-id'
[Fri Aug 04 12:48:56.904129 2017] [rewrite:trace3] [pid 22823:tid 140368028878592] mod_rewrite.c(477): [client ::1:58312] ::1 - - [localhost/sid#788520][rid#7fa9e4002970/initial] [perdir /var/www/localhost/htdocs/wordpress/] strip per-dir prefix: /var/www/localhost/htdocs/wordpress/store-category/my-id -> store-category/my-id
[Fri Aug 04 12:48:56.904132 2017] [rewrite:trace3] [pid 22823:tid 140368028878592] mod_rewrite.c(477): [client ::1:58312] ::1 - - [localhost/sid#788520][rid#7fa9e4002970/initial] [perdir /var/www/localhost/htdocs/wordpress/] applying pattern '^store-category/(.+)/?$' to uri 'store-category/my-id'
[Fri Aug 04 12:48:56.904143 2017] [rewrite:trace2] [pid 22823:tid 140368028878592] mod_rewrite.c(477): [client ::1:58312] ::1 - - [localhost/sid#788520][rid#7fa9e4002970/initial] [perdir /var/www/localhost/htdocs/wordpress/] rewrite 'store-category/my-id' -> '/wordpress/store-category/?cid=my-id'
[Fri Aug 04 12:48:56.904147 2017] [rewrite:trace3] [pid 22823:tid 140368028878592] mod_rewrite.c(477): [client ::1:58312] ::1 - - [localhost/sid#788520][rid#7fa9e4002970/initial] split uri=/wordpress/store-category/?cid=my-id -> uri=/wordpress/store-category/, args=cid=my-id
[Fri Aug 04 12:48:56.904151 2017] [rewrite:trace2] [pid 22823:tid 140368028878592] mod_rewrite.c(477): [client ::1:58312] ::1 - - [localhost/sid#788520][rid#7fa9e4002970/initial] [perdir /var/www/localhost/htdocs/wordpress/] trying to replace prefix /var/www/localhost/htdocs/wordpress/ with /wordpress/
[Fri Aug 04 12:48:56.904155 2017] [rewrite:trace2] [pid 22823:tid 140368028878592] mod_rewrite.c(477): [client ::1:58312] ::1 - - [localhost/sid#788520][rid#7fa9e4002970/initial] [perdir /var/www/localhost/htdocs/wordpress/] trying to replace context docroot /var/www/localhost/htdocs with context prefix 
[Fri Aug 04 12:48:56.904158 2017] [rewrite:trace1] [pid 22823:tid 140368028878592] mod_rewrite.c(477): [client ::1:58312] ::1 - - [localhost/sid#788520][rid#7fa9e4002970/initial] [perdir /var/www/localhost/htdocs/wordpress/] internal redirect with /wordpress/store-category/ [INTERNAL REDIRECT]

(在它尝试查找默认文档index.php时,随后是一些其他日志记录)

【讨论】:

@shazyriver 您可以访问 apache 日志并激活 mod_rewrite 的日志记录吗? (请参阅httpd.apache.org/docs/current/mod/mod_rewrite.html) httpd.conf 或由它导入的一些文件(在我的电脑上我有它在/etc/apache2/modules.d/00_default_settings.conf 但它取决于你的系统) 日志中的信息过多。找不到线索:( 只检查包含rewrite 的行。我用我的日志更新帖子,因为它不允许我在 cmets 中发布它。 我做到了。他们没有给我任何线索。

以上是关于.htaccess 内部重定向不适用于字符串参数的主要内容,如果未能解决你的问题,请参考以下文章

htaccess 重定向适用于邮递员而不适用于 chrome (CORS)

.htaccess 将查询字符串附加到内部重定向

HTTP 到 HTTPS 重定向不适用于现有规则

htaccess url重定向参数不起作用

htaccess 301 重定向 - 删除查询字符串 (QSA)

htaccess 永久重定向引发内部服务器错误