【问题标题】:Convert Query Parameters to Pretty URL将查询参数转换为漂亮的 URL
【发布时间】:2022-02-02 08:57:49
【问题描述】:

我有脚本文件 post.php,我正在使用没有 .php 扩展名的脚本文件,使用下面的代码

Options -Indexes

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)$ $1.php [NC,L]

我想使用一个漂亮的 URL。例如,当我请求 URL /post/12 时,它应该给我 $_GET 参数 12,就像我使用的查询字符串一样:post?id=12

有可能吗?另外,我不想将所有请求定向到index.php。仅对 posts.php 脚本发出的请求。

【问题讨论】:

标签: apache .htaccess mod-rewrite


【解决方案1】:

在附加.php 扩展名的通用重写之前,使用单独的规则处理/post/12 形式的请求。

试试这样:

Options -Indexes -MultiViews

RewriteEngine On

# Remove trailing slash if not a directory
# eg. "/post/" is redirected to "/post"
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*)/$ /$1 [R=301,L]

# Rewrite "/post/<id>" to "/post.php?id=<id>"
RewriteRule ^(post)/(\d+)$ $1.php?id=$2 [L]

# Rewrite "/post" to "/post.php" (and other extensionless URLs)
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule (.*) $1.php [L]

注意事项:

  • 需要禁用 MultiViews 才能使第二条规则生效。
  • 附加.php 扩展名的初始规则并不完全正确。在某些情况下,它可能会导致 500 错误。但是,第一个 条件 是多余的 - 在检查请求 + .php 确实 映射到文件之前检查请求是否映射到文件是没有意义的。这些是相互包容的表达方式。
  • 如果没有删除尾部斜杠的第一条规则(例如,/post//post),它会提出如何处理对 /post/ 的请求(没有 id)的问题- 这应该服务于/post.php(与/post 相同)还是/post.php?id=(空URL 参数)?无论如何,这两者大概是同一件事。但是,这些都会导致内容重复(可能),因此需要重定向。

【讨论】:

  • 效果很好。刚刚将 "\d+" 更改为 ".*" 因为 id 可能不是整数。非常感谢
猜你喜欢
  • 2017-03-15
  • 1970-01-01
  • 2013-07-21
  • 1970-01-01
  • 1970-01-01
  • 2017-02-24
  • 2022-10-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多