【问题标题】:URL rewriting causing internal server error [closed]URL重写导致内部服务器错误[关闭]
【发布时间】:2012-12-28 15:41:29
【问题描述】:

我是 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 中的替换 一/二/三

到 购物/购物/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 重写来实现这一点。因此,在根目录中,我已将以下几行添加到 .htaccess 中。

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

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

如何才能显示更好的网址? 谢谢

【问题讨论】:

  • RewriteRule 不能直接用于查询字符串。您需要查看RewriteCond
  • 查看 apache 错误日志。确保 mod_rewrite 已启用。 (a2enmod rewrite)

标签: php apache .htaccess url


【解决方案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

【讨论】:

【解决方案2】:

试试这个:

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

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

您好。

【讨论】:

    【解决方案3】:

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

    尝试以下方法(我目前无法验证,抱歉):

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

    第一条规则基本上说“如果查询字符串匹配这个模式(记住额外的东西)”,第二条规则说“那么anything 更改为 /index.php?p=shopping… 并添加您从 Cond 中记住的内容”。 %1 是对最后一个 Cond 匹配的捕获缓冲区的反向引用,而 $1 是对 规则的反向引用 模式。

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

    关于这个方法的两点:

    1. 您页面中的链接不会更改,它仍会在鼠标悬停时显示为…one/two/three…。只有当有人真正访问它时才会应用更改。

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

    欲了解更多信息,请参阅http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html

    【讨论】:

      【解决方案4】:

      另一种方法:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-11
        • 1970-01-01
        相关资源
        最近更新 更多