【问题标题】:convert original URL to friendly URL将原始 URL 转换为友好 URL
【发布时间】:2012-07-27 10:05:41
【问题描述】:

在我的网站上有一个注册导师的链接。那个链接是这样的

http://www.myweb.com/profiles/tutors/index.php?tutorCode=1285&tutorName=Robert%20Sakoo&city=Sidny

所以我需要像这样重写这个链接:

www.myweb.com/1285/Rober Sakoo

谁能告诉我是否可以将上面的原始 URL 重写为我的预期 URL?

【问题讨论】:

    标签: .htaccess


    【解决方案1】:

    那应该是附近的某个地方:

    RewriteEngine on
    RewriteRule ^([0-9]+)/(.+)$ /profiles/tutors/index.php?tutorCode=$1&tutorName=$2 [NC,QSA]
    

    由于您没有指定如何处理,我没有考虑您的city 参数,因此将QSA(查询字符串附加)添加到规则中,因此 GET 中的参数仍然传递给剧本。

    【讨论】:

    • 我刚刚测试了它并且它正在工作,当您在任务网址中输入 www.lankainstitute.com/1285/Shamdhi 时,您的浏览器会显示什么(+http 状态)?
    • 不,它仍然显示原始网址。告诉我我需要把这个 .htaccess 文件放在哪里。我只是把它放在我的根目录和检查的 URL 中。
    • 它仍然在浏览器的任务栏中显示原始 URL 是正常的,这就是“友好 URL”的用途。但是,如果您将脚本物理地放在 /profiles/tutors/index.php 中,那么它应该被执行。是的,htaccess 必须放在你的根目录中。
    • 我试过了..但它不起作用..实际上我哪里出错了..??
    • 我只能再问一次:在url任务栏输入www.lankainstitute.com/1285/Shamdhi,你的浏览器显示什么(+http状态)?
    【解决方案2】:

    您似乎对 URL 和重写的工作方式感到困惑。 “我需要将 this2 重写为 this1” 的概念意味着:

    1. 有人在其地址栏中输入 this2 或点击 this2 链接。
    2. 服务器看到 this2 的请求
    3. 服务器有一套规则在内部将请求从 this2 重写为 this1
    4. this1 提供给浏览器

    请注意,所有这一切的重要概念是浏览器请求“this2”链接,服务器在内部将请求重写为“this1”。但这可能根本不是您想要的,因为那样您将采用丑陋的 URL 并将它们重写为外观漂亮的 URL,从而错过了外观友好的 URL。

    经常,尤其是在这里,人们要求诸如“我想将此网址更改为此网址”之类的内容,或者在有两步重定向过程时要求重写。这是第二步(您根本不需要),它采用 this1 并 将浏览器重定向 到 this2 以便 url 地址栏更改为 this2:

    1. 有人在其地址栏中输入 this1 或点击 this1 链接。
    2. 服务器看到 this1 的请求
    3. 服务器有一套规则将浏览器外部重定向到this2。
    4. 浏览器的地址栏现在显示 this2
    5. 浏览器请求this2
    6. 服务器看到 this2 的请求
    7. 服务器有一套规则在内部将请求从 this2 重写为 this1
    8. this1 提供给浏览器

    所以整个循环卷积只是,所以当浏览器尝试转到 this1 时,它会被重定向到 this2 但仍然实际上是从 this1 获取内容。

    所以我认为这一定是你想要的。尝试将其放入您的 htaccess 文件中:

    RewriteEngine On
    
    # check if the actual request if for "this1"
    RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /profiles/tutors/index.php\?tutorCode=([0-9]+)&tutorName=([^&]+)&?([^\ ]+)
    # redirect to "this2"
    RewriteRule ^profiles/tutors/index\.php /%1/%2/?%3 [R=301,L,NE]
    
    # now rewrite "this2" back to "this1"
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^([0-9]+)/(.+)/$ /profiles/tutors/index.php?tutorCode=$1&tutorName=$2 [L,QSA]
    

    请注意,city 参数永远不会在友好 URL 中进行编码,因此它会作为查询字符串的一部分保留。您可以更改此设置,使友好的 URL 看起来像:/id/name/city/ 而不仅仅是 /id/name/,该修改应该是微不足道的。

    【讨论】:

    • @user1543817 当然,我在最后一段中提到过它会做到这一点
    • 现在我的 profile/tutor/index.php 文件无法识别我的 css 文件。我把它放在这个'profile/styles/file.css'中。你能告诉我这是什么原因吗?
    • @user1543817 这是一个绝对/相对 URI 问题。尝试在标题中的某处添加<base href="/">。
    • 我能得到你的帮助吗?
    猜你喜欢
    • 2016-08-19
    • 1970-01-01
    • 2016-04-29
    • 1970-01-01
    • 2012-08-16
    • 1970-01-01
    • 2012-09-25
    • 1970-01-01
    • 2013-02-10
    相关资源
    最近更新 更多