【问题标题】:URL Rewrite not working? [closed]URL重写不起作用? [关闭]
【发布时间】:2012-10-22 20:51:28
【问题描述】:

我一直在想办法弄清楚为什么我的 URL 重写不起作用!

我正在使用

RewriteEngine On
Options +FollowSymLinks
RewriteRule ^([^/]*)/([^/]*)/$ /profile.php?county=$1&name=$2&id=1 [L]

没有任何影响,我检查了 mod_rewrite 是在哪个位置。如果我使用

RewriteRule ^rdr\.html http://www.google.com/? [R=301,L]

我被重定向到谷歌,所以我知道它肯定是我正在做的事情。

我试图重写的网址是......

http://www.mysite.com/profile.php?county=Cheshire&name=Martin-Mack&id=2

【问题讨论】:

  • 您可以尝试将 ([^/]*) 替换为 (.*) 并确保您尝试重写的 URL 有一个斜杠。
  • 你是想把/x/y/改写成/profile.php?county=x&name=y&id=1,还是反过来?

标签: apache url-rewriting


【解决方案1】:

不是问题的确切答案,但总体上可能有用;您可以打开重写日志记录,这有助于追踪问题。

Apache 2.2:

RewriteLog com.example_rewrite.log 
RewriteLogLevel 3

Apache 2.4 中的语法略有变化。

【讨论】:

    【解决方案2】:

    这对我有用:

    .htaccess

    RewriteEngine On
    RewriteRule ^([^/\.]+)/([^/\.]+)/?$ profile.php?county=$1&name=$2&id=1
    

    profile.php

    <h1>Profile</h1>
    <?php
    echo "County: " . $_GET['county'] . "<br>";
    echo "Name: " . $_GET['name'] . "<br>";
    echo "Id: " . $_GET['id'];
    

    此网址:http://localhost/tests/htaccess_test/Cheshire/Martin-Mack

    生成了这个 HTML:

    <h1>Profile</h1>
    County: Cheshire<br>Name: Martin-Mack<br>Id: 1
    

    在 Apache 2.2.21 和 PHP 5.3.10 上测试。


    在我的测试中,我将这两个文件都放在了http://localhost/tests/htaccess_test/,但是你可以把它们放在你想要的地方;它们只需要在同一个文件夹中。

    以你为例,你应该把文件放在你网站的根目录下,这样当你访问http://www.yoursite.com/Cheshire/Martin-Mack时,重定向就会起作用。

    如果仍然无法使用,请尝试在 RewriteEngine On 之后添加 RewriteBase /

    完整示例:

    RewriteEngine On
    RewriteBase /
    RewriteRule ^([^/\.]+)/([^/\.]+)/?$ profile.php?county=$1&name=$2&id=1
    

    更新:在您的原始代码中,id 参数是静态的。要让它也能正常工作,试试这个:

    RewriteEngine On
    RewriteRule ^([^/\.]+)/([^/\.]+)/([^/\.]+)/?$ profile.php?county=$1&name=$2&id=$3
    

    【讨论】:

    • 感谢@Simone 的详细回复,但我仍然无法让它工作,我不确定我是否正确理解了整个概念。我访问的 URL 是 site.com/profile.php?county=Cheshire&name=Liam-Gallagher&id=1 这个链接是从我的 php 使用 php 变量生成的
    • 我的示例工作方式不同。尝试访问site.com/Cheshire/Martin-Mack,您应该静默重定向到profile.php?county=Cheshire&amp;name=Liam-Gallagher&amp;id=1
    • 某种作品@Simone,但我的问题是现在的“ID”变量,它总是1,而它应该为每个用户改变?
    • 这已经阻止了重写工作现在@Simone
    • 不,它只是说找不到页面,而最初它会重定向到该页面,但 ID 错误
    【解决方案3】:

    你的规则非常接近。

     RewriteRule ^([^/]+)/([^/]+)/?$ /profile.php?county=$1&name=$2&id=1 [L]
    
    • 我认为 Samuel Cook 先生触及了您的问题 --- 您的规则需要尾部斜杠。在规则的尾部斜杠之后添加? 允许带有它和不带有它的 URL。

    • 另外,修改后的规则使用+s 而不是你的*s,因为* 修饰符将匹配一个空字符串,并可能导致重定向循环。

      李>

    旁注:在测试时使用 302 重定向!您的浏览器将“记住”301 重定向。

    【讨论】:

    • 感谢您的回复@smhmic,但它仍然无法正常工作:/
    • @Liam 通常,规则开头的克拉 (^) 很适合我。它仍在排查原因,因为该规则应该适用于克拉并且并不总是可以安全删除......但尝试删除它只是为了看看。
    【解决方案4】:

    this answer clarifies how URLs get rewritten and redirected 的顶部。那里发生了两种完全不同的事情。

    要将/profile.php?county=foo&amp;name=bar&amp;id=1234 之类的 URL 更改为更好看的变体,您需要匹配实际请求并重定向浏览器:

    RewriteCond %{THE_REQUEST} ^(GET|POST|HEAD)\ /profile\.php\?county=([^&]+)&name=([^&]+)&id=([0-9]+)
    RewriteRule ^ /%2/%3/%4/? [L,R=301]
    

    请注意,id 也必须是 URL 的一部分(通过 %4 反向引用)。这使得当有人在浏览器中键入 URL:http://mysite.com/profile.php?county=Cheshire&amp;name=Martin-Mack&amp;id=2 时,他们会在外部重定向到 http://mysite.com/Cheshire/Martin-Mack/2/,从而更改地址栏中的 URL。

    然后为了在内部重写更好看的 URL 并将其路由回 php 脚本:

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^/?([^/]+)/([^/]+)/([0-9]+)/?$ /profile.php?county=$1&name=$2&id=$3 [L]
    

    这会反过来,但只是在内部,这样浏览器地址栏中的 URL 保持不变,而内容是从 profile.php 提供的。

    【讨论】:

      【解决方案5】:

      如果你的重写是 in 或 htaccess,它将与“profile.php”进行比较,因此中间的 / 永远不会匹配,更不用说末尾的第二个斜线了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-20
        • 1970-01-01
        • 2016-12-18
        • 2023-03-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多