2017-07-27 91 views
14

所以我一直在这个小时,但不能解决它。在stackoverflow没有解决我的问题。问题是,我有一个重定向规则在我的.htaccess如下.htaccess内部重定向不能使用字符串参数

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

当CID是一个数字,但是当使用像一个字符串“我的钥匙”它不工作这重定向工作。关键是我必须改变这个规则。

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 
+0

这是该只有在您的.htaccess文件中的规则? –

+0

没有。这是一个标准的wordpress .htaccess与这个额外的规则 – shazyriver

+0

是否有可能发生重定向,但接收请求的脚本期望的数字不是字符串,因此失败? –

回答

-1

用这个,这是成功地为我工作,我希望它会为你的作品。

RewriteEngine on 
IndexIgnore * 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond $1 !^(index\.php|img|robots\.txt) 
RewriteRule ^(.*)$ index.php/$1 [L] 
RewriteRule ^wordpress/index.php/.*$ - [F,L,NC] 
+0

你能解释它在做什么?我必须在wordpress环境中使用它。如果不知道它的作用,我不能放任何东西。谢谢。 – shazyriver

+0

@shazyriver **的RewriteCond%{} REQUEST_FILENAME -f ** **的RewriteCond%{} REQUEST_FILENAME -d ** **的RewriteCond $ 1→(索引\ .PHP!|!IMG |机器人\ .txt)** ...表示如果浏览器中指定名称的文件不存在,或浏览器中的目录不存在,并且页面不是index.php,则img文件夹或robots.txt。然后进入下面的重写规则。 最后一个RewriteRULE是实际重定向 –

+0

但我没有看到我放在那里的规则 – shazyriver

0

正则表达式是贪婪的(从左到右)。你可能会拉其他东西。我发现最简单的方法是不使用URL类(很少会匹配所有内容)。

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

您可能还可以简化这一点,取决于您希望如何处理可能商店类别ID后畸形的URL。

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

编辑:你说得对。我没有测试整个htaccess。你在rewritebase和规则中再次指定wordpress路径两次。我已经更新了上述规则,以及在测试人员提供了一个链接到更新的解决方案:

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

+0

这仍然不影响结果 – shazyriver

+0

非常感谢。但我没有写这个规则。我用wordpress函数自动生成它。并使用一个数字它的作品。所以我不认为这与wordpress路径两次的原因有什么关系。 – shazyriver

+0

非常感谢。但我没有写这个规则。我用wordpress函数自动生成它。并使用一个数字它的作品。所以我不认为这与wordpress路径两次的原因有什么关系。 – shazyriver

1

我做了一些尝试当地,发现我的作品,如果我把这两个规则:

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)。在我主我启用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

+0

没有为我工作:( – shazyriver

+0

@shazyriver你可以访问Apache日志并激活日志记录mod_rewrite?(请参阅http://httpd.apache.org/docs/current/mod/mod_rewrite.html) – Urban

+0

但是我编辑哪个文件来启用日志? – shazyriver