如何在不破坏图像、CSS 和 JavaScript 的情况下实现友好的 URL? [关闭]

Posted

技术标签:

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

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

blog.php?id=Blizzard

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

blog/Blizzard

使用.htaccess 还是 PHP?


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

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

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

【问题讨论】:

“被摧毁”?这听起来很奇怪。 究竟是什么不起作用?你有什么努力让它发挥作用? 【参考方案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 指令在此特定示例中也无关紧要。

以上是关于如何在不破坏图像、CSS 和 JavaScript 的情况下实现友好的 URL? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何在不破坏图像纵横比的情况下调整 QImage 或 QML 图像的大小以适应父容器

我如何(url)在不破坏 mime 的情况下重写?

Jquery 循环 - 如何在不破坏缩略图寻呼机的情况下将图像包装在跨度标签中?

在使用 CSS 加载或破坏图像源时操作图像占位符

如何在不使用 CSS word-break 属性的情况下阻止文本跑出屏幕并破坏布局?

缓存在 SASS 文件中链接的破坏图像