【问题标题】:How to implement friendly URLs without breaking images, CSS and JavaScript? [closed]如何在不破坏图像、CSS 和 JavaScript 的情况下实现友好的 URL? [关闭]
【发布时间】:2021-11-18 09:11:47
【问题描述】:

我网站上的链接显示如下:

blog.php?id=Blizzard

我怎样才能将它们转换如下?

blog/Blizzard

使用.htaccess 还是 PHP?


我在.htaccess 中使用了以下指令:

RewriteRule ^blog/(.*)$ ./blog.php?id=$1

但是图像、CSS 和 JavaScript 都被破坏了!?

【问题讨论】:

  • “被摧毁”?这听起来很奇怪。 究竟是什么不起作用?你有什么努力让它发挥作用?

标签: php .htaccess url mod-rewrite url-rewriting


【解决方案1】:

但是图片、css和javascript代码被破坏了

可能是因为您使用的是静态资源的相对 URL。如果您将图像引用为img/myimage.jpg,那么浏览器 现在将寻找/blog/img/myimage.jpg,而不是像以前那样寻找/img/myimage.jpg(使用您的示例)。

您需要使用根相对 URL(以斜杠开头)或绝对 URL(方案 + 主机名)才能从不同的 URL 路径深度访问资源。有时您可以使用 head 部分中的 base 元素解决此问题,但是,这种方法有一些注意事项。

请参阅my answer 到网站管理员堆栈上的以下问题,该问题详细介绍了这个确切问题:.htaccess rewrite URL leads to missing CSS


RewriteRule ^blog/(.*)$ ./blog.php?id=$1

您应该删除RewriteRule 上的./ 前缀替换。点(表示“当前目录”)在 URL 路径中没有任何作用(它被解析掉了)。

如果您稍后添加其他规则,您还应该包含 L 标志。

您还需要确保 MutliViews 已禁用,否则,blog.php 将在没有 id 属性的情况下被“神奇地”调用,并且您的脚本将失败。 (MultiViews 基本上可以启用无扩展 URL,但可能会导致其他问题。)请参阅 https://httpd.apache.org/docs/2.4/content-negotiation.html

或者,如果您要更改 URL 结构,您还可以将 /blog.php?id=<value> 形式的 URL 重定向到 /blog/<value>,以保留 SEO 并重定向书签链接。 (但请注意,您应该已经链接到 /blog/<value> 形式的 URL。)

例如

# Disable MultiViews
Options -MuliViews

# Redirect "/blog.php?id=<value>" to "/blog/<value>"
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} ^id=([^&]*)
RewriteRule ^blog\.php$ /blog/%1 [QSD,R=301,L]

# Rewrite "blog/<value>" to "/blog.php?id=<value>"
RewriteRule ^blog/(.*) blog.php?id=$1 [QSA,L]

上述指令的补充说明:

  • REDIRECT_STATUS 环境变量的检查可确保仅重定向直接请求,而不会被随后的重写重写请求。
  • QSD 标志会丢弃请求中的原始查询字符串。
  • QSA 标志附加(合并)可能在原始请求中的任何查询字符串,以及在替换中分配的查询字符串。如果您不期望任何查询字符串,则删除此标志。例如。仅当存在 QSA 标志时,对 /blog/Blizzard?foo=1 的请求才会在内部重写为 /blog.php?id=Blizzard&amp;foo=1

【讨论】:

    【解决方案2】:

    您可以使用 .htaccess 创建短网址。

    例子:

    RewriteEngine On
    RewriteBase /
    RewirteRule sample /sample2.php
    

    只需 3 行代码

    RewriteEngine On <== Use Rewrite Module
    RewriteBase / <==  .htaccess file locate
    RewriteRule  <== ShortURL RULE
    

    你写

    RewirteRule sample /sample2.php
    

    使用http://127.0.0.1/sample

    重定向 sample2.php

    【讨论】:

    • 图片、css和javascript代码被销毁
    • RewirteRule sample /sample2.php - 尽管这样的指令(如果拼写正确)会导致重写循环(500 错误),因为正则表达式 sample 也匹配目标 URL /sample2.phpRewriteBase 指令在此特定示例中也无关紧要。
    猜你喜欢
    • 1970-01-01
    • 2016-05-17
    • 2010-11-04
    • 2021-01-27
    • 2019-02-28
    • 2015-05-16
    • 1970-01-01
    • 2018-03-08
    • 2015-08-29
    相关资源
    最近更新 更多