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

Php URL重写导致内部服务器错误,php,apache,.htaccess,url,Php,Apache,.htaccess,Url,我是一个新的URL重新编写 我有一个锚文本在主页上,当点击将打开另一个页面。单击链接时,浏览器中显示的目标url为 相反,我想显示在URL中 所以本质上我看到的是URL中的替换 一/二/三 到 购物/商店/ipad 我想要网址 看起来像 请注意,我有14000页,所以不能到处去换。 我希望通过url重写实现这一点。因此,在根目录中,我添加了.htaccess以下几行 RewriteEngine On RewriteRule ^shopping/shop/ipad/?$ one/two/

我是一个新的URL重新编写

我有一个锚文本在主页上,当点击将打开另一个页面。单击链接时,浏览器中显示的目标url为

相反,我想显示在URL中

所以本质上我看到的是URL中的替换 一/二/三

到 购物/商店/ipad

我想要网址 看起来像

请注意,我有14000页,所以不能到处去换。 我希望通过url重写实现这一点。因此,在根目录中,我添加了.htaccess以下几行

RewriteEngine On  
RewriteRule  ^shopping/shop/ipad/?$ one/two/three/pdp [NC,L] 
但这会导致内部服务器错误

如何实现显示更好的url? 谢谢

试试这个:

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
我希望你能解决你的问题,对不起,如果你没有,我还没有试过


问候。

重写规则
只在URL的路径部分(
/index.php
部分)有效,而不是查询字符串(在
之后的所有内容)。您需要一个
RewriteCond
来捕获查询字符串,然后是一个
RewriteRule
,它只保留路径部分,但会更改查询字符串

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

第一条规则基本上是“如果查询字符串与此模式匹配(记住额外的内容)”,第二条规则是“然后将任何内容更改为
/index.php?p=shopping…
,并添加从Cond中记住的内容”。
%1
是对上一次第二次匹配的捕获缓冲区的反向引用,而
$1
是对规则模式的反向引用

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

这种方法有两点:

  • 页面中的链接不会被更改,它仍然会在鼠标上方和类似位置显示为
    …一/二/三…
    。只有当有人实际访问时,才会应用更改

  • 这个实际例子很脆弱,;这取决于查询字符串的
    p=
    部分在前面,以及后面的内容。如果有更多事例,则需要更改正则表达式

  • 有关更多信息,请参见另一种方法:

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

    您可以尝试以下方法:

    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

    重写规则
    不能直接用于查询Sting。您需要查看
    RewriteCond
    。查看apache错误日志。确保mod_rewrite已启用。(
    a2enmod rewrite
    )谢谢Felipe。这个成功了。我在看一个微小的变化。假设我想要而不是我该怎么做?非常感谢#几分钟后我会更新我的答案。@Anita更新了我的答案。
    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]