URL重写导致内部服务器错误

时间:2012-12-28 15:41:29

标签: php apache .htaccess url

我是网址重写的新手。

我在主页上有一个锚文本,点击后会打开另一页。单击链接时在浏览器中显示的目标URL是 http://example.com/index.php?p=one/two/three/pdp&abc=436

我希望在URL中显示 http://example.com/index.php?p=shopping/shop/ipad/pdp&abc=436

基本上我正在看的是URL中的替换 一/二/ 3

要 购物/店铺/ ipad的

我想要网址http://example.com/index.php?p=one/two/three/pdp&abc=436  看起来像http://example.com/index.php?p=shopping/shop/ipad/pdp&abc=436

请注意,我有14,000页,因此无法进行身体检查。到处改变。 我希望这发生在使用url重写。所以在root中我已经添加了.htaccess以下几行。

RewriteEngine On  
RewriteRule  ^shopping/shop/ipad/?$ one/two/three/pdp [NC,L] 

但这会导致内部服务器错误。

我怎样才能显示更好的网址? 感谢

4 个答案:

答案 0 :(得分:1)

你可以试试这个:

RewriteEngine On
RewriteBase /
RewriteCond %{QUERY_STRING}  p=one/two/three/(.*)
RewriteRule .*  http://example.com/index.php?p=shopping/shop/ipad/%1? [R=301,L]

它将重定向:

http://example.com/index.php?p=one/two/three/pdp&abc=436

要:

http://example.com/index.php?p=shopping/shop/ipad/pdp&abc=436

我假设`p=one/two/three/p=shopping/shop/ipad/是常量。如果它们是变量,您应该更新问题并描述它们的关系和模式,以便能够捕获并替换它们。

第二个选项:

RewriteEngine On
RewriteBase /
RewriteCond %{QUERY_STRING}  p=one/two/three/([^/]+)&([^/]+)=([^/]+).*
RewriteRule .*  http://example.com/index.php?p=shopping/shop/ipad/%1/%2/%3? [R=301,L]

它将重定向:

http://example.com/index.php?p=one/two/three/anything1&anything2=anything3

要:

http://example.com/index.php?p=shopping/shop/ipad/anything1/anything2/anything3

答案 1 :(得分:0)

试试这个:

Redirect 301 old_url new_url

示例:

Redirect 301 index.php?p=one/two/three/pdp&abc=436 http://example.com/index.php?p=shopping/shop/ipad/pdp&abc=436

我希望你解决问题,对不起,如果你没有,我还没试过。

问候。

答案 2 :(得分:0)

RewriteRule仅适用于网址的路径部分(/index.php部分),而不是查询字符串(之后的所有内容) ?)。您需要RewriteCond来捕获查询字符串,然后是RewriteRule,它会单独留下路径部分,但会更改查询字符串。

尝试以下(我暂时无法验证,抱歉):

RewriteCond %{QUERY_STRING}   p=one/two/three/pdp/&(.*)
RewriteRule *                 /index.php?p=shopping/shop/ipad/&%1 [NC,R=301,L]

第一条规则基本上是“ if 查询字符串匹配此模式(记住额外的东西)”,第二条规则说“ then 任何更改为/index.php?p=shopping…并添加您从Cond记住的内容“。 %1后向引用到最后一个 Cond 匹配的捕获缓冲区,而不是$1,后者用于后向引用规则模式。

第二条规则可以匹配所有内容,因为它只会在第一条规则匹配时触发。 R=301表示使用代码301执行实际重定向(例如),否则访问者将永远不会看到更改。

关于这种方法的两件事:

  1. 您网页中的链接不会更改,在鼠标悬停时类似的内容仍会显示为…one/two/three…。只有在有人实际访问时才会应用此更改。

  2. 这个实际例子非常脆弱;它取决于首先出现的查询字符串的p=部分,以及实际跟随它的内容。如果您有更多案例,则需要更改正则表达式。

  3. 有关详细信息,请参阅http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html

答案 3 :(得分:0)

又一种方法:

如果您有足够的权限来更改index.php脚本,则可以重写那里,而不是在Web服务器中。这样做的好处是,您可以使用强大的语言,它已经很好地处理了查询字符串。