【问题标题】:How to simplify PHP site URL using htaccess rewrite rule?如何使用 htaccess 重写规则简化 PHP 站点 URL?
【发布时间】:2019-12-18 05:06:12
【问题描述】:

我有这个网站是由开发人员用 PHP 制作的,现在所有页面都有这个 URL 结构,

websitename.com/software.php?name=product_name

在网站的各个页面上每次都会变化的只有“产品名称”,例如:

websitename.com/software.php?name=product_name1

websitename.com/software.php?name=product_name2

websitename.com/software.php?name=product_name3

我只想拥有这样的网址:

websitename.com/product_name1

websitename.com/product_name2

websitename.com/product_name3 等等..

你能告诉我我应该在我的 htaccess 上添加什么代码来获得这样的 URL 结构。

【问题讨论】:

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


【解决方案1】:

对于 websitename.com/any 到 websitename.com/software.php?name=any 在您的 .htaccess 文件中使用此规则

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ /software.php?name=$1 [L]
</IfModule>

但更有用的 URL 结构(仅适用于产品的软件)是 websitename.com/software/any-product-name 到 websitename.com/software.php?name=any-product-name

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^software\/(.*)$ /software.php?name=$1 [L]
</IfModule>

对于 SEO 友好的 URL,在产品名称中使用“-”而不是“_”。

【讨论】:

  • 它工作得很好,但两个链接都可用,你能告诉我代码,通过它我可以将旧 URL 结构 301 重定向到新 URL 结构,谢谢
【解决方案2】:

这应该为您指明正确的方向:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/?(.*)$ /software.php?name=$1 [END]

如果您使用上述规则收到内部服务器错误(http 状态 500),那么您很可能操作的是非常旧版本的 apache http 服务器。在这种情况下,您将在 http 服务器错误日志文件中看到不支持的 [END] 标志的明确提示。您可以尝试升级或使用较旧的[L] 标志,在这种情况下它可能会起作用,尽管这取决于您的设置。

此规则同样适用于 http 服务器主机配置或动态配置文件(“.htaccess”文件)。显然重写模块需要在http服务器内部加载并在http主机中启用。如果您使用动态配置文件,您需要注意它的解释在主机配置中完全启用,并且它位于主机的 DOCUMENT_ROOT 文件夹中。

一般来说:您应该始终喜欢将此类规则放在 http 服务器主机配置中,而不是使用动态配置文件(“.htaccess”)。这些动态配置文件增加了复杂性,通常是意外行为的原因,难以调试,而且它们确实减慢了 http 服务器的速度。它们仅在您无法访问真正的 http 服务器主机配置(阅读:非常便宜的服务提供商)或坚持编写自己的规则的应用程序(这是一个明显的安全噩梦)的情况下作为最后一个选项提供。


更新:在下面的评论中,除了将请求重定向到原始的、未重写的 URL 之外,您还要求。这是一个扩展版本:

RewriteEngine On

RewriteCond %{QUERY_STRING} (?:^|&)name=([^&]+)(?:&|$)
RewriteRule ^/?software\.php$ /%1 [R=301]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/?(.*)$ /software.php?name=$1 [END]

最好先从 302 临时重定向开始,然后再将其更改为 301 永久重定向,前提是您确定一切都已正确设置。这样可以防止在尝试时出现缓存问题...

【讨论】:

  • 不工作的伙伴,它给出了 500 服务器错误,最后也尝试了 [L] 但仍然没有更改 url 结构
  • 下面的代码是有效的,但是你能告诉我旧的url结构可以301同时重定向到新的url结构的代码吗,谢谢 RewriteEngine On RewriteCond %{ REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ /software.php?name=$1 [L]
  • 更新后的代码仍然不起作用,我仍然有相同的旧网址,没有重定向。
  • 这意味着根本不应用规则。请指定您尝试使用的确切 URL,以及您实施这些规则的位置。您如何确保完全评估此类动态规则?
  • 该项目正在进行中,所以也许我不能一直在 htaccess 上保留该代码,但为了让您查看它,我将在其他地方设置它,如果可能的话,我们可以在 facebook 上聊聊吗?我会很感激的
猜你喜欢
  • 1970-01-01
  • 2013-12-20
  • 2016-03-15
  • 2011-12-06
  • 2016-11-19
  • 1970-01-01
  • 1970-01-01
  • 2014-02-04
相关资源
最近更新 更多