如何从像 "example.com/products/123/title-of-this-product" 这样干净的 url 中获取 $_GET['id']?
How to $_GET['id'] from a clean url like "example.com/products/123/title-of-this-product"?
我希望我的 URL 看起来像这样:
example.com/products/123/title-of-this-product
实际的URL是这样的:
example.com/products.php?id=123&title=title-of-this-product
.htaccess
文件正确解释了我的 URL,因此该页面上的用户只能看到干净的 URL。但是,如果我尝试在 products.php
页面上使用 $_GET['id']
,脚本会崩溃,因为它无法识别 URL.
中的任何 id
.htaccess
代码:
Options +FollowSymLinks +MultiViews
RewriteEngine On
RewriteRule ^([0-9]+)(?:/([^/]*))?/?$ ./products.php?id=&title= [L,NC]
products.php
代码:
$product_id = isset($_GET['id']) ? $_GET['id'] : "Error! I can't find your product!";
如果我想要一个干净的 URL,如何保留 PHP 函数的 URL 参数?
你实际上有两个问题...
MultiViews
(mod_negotiation 的一部分)已启用,服务于 products.php
。
- 您的
RewriteRule
模式 不正确,与请求的 URL. 不匹配
Options +FollowSymLinks +MultiViews
您需要禁用 MultiViews
(您已明确启用它)。为您的 products.php
文件(没有任何 URL 参数)提供服务的是 MultiViews(mod_negotiation 的一部分),而不是后面的 mod_rewrite 指令。 MultiViews 本质上允许无扩展的 URLs 以最小的努力,然而,它可能是意外冲突的原因(与 mod_rewrite)——就像在这种情况下。
您的 RewriteRule
指令实际上没有做任何事情。如果 .htaccess
文件位于文档根目录中,则 RewriteRule
模式 ^([0-9]+)(?:/([^/]*))?/?$
与请求的 URL (/products/123/title-of-this-product
),所以该指令实际上根本没有被处理(尽管 MultiViews 仍然会覆盖它,即使它被处理了)。
试试这样:
# Disable MultiViews
Options +FollowSymLinks -MultiViews
RewriteEngine On
RewriteRule ^products/([0-9]+)(?:/([^/]*))?/?$ products.php?id=&title= [L,NC]
您从与 RewriteRule
模式 相匹配的 URL-path 开始缺少 products
。在正则表达式的开头没有 products/
它只会匹配你在 /products/
子目录中,即。 /products/.htaccess
。 RewriteRule
指令匹配相对于 .htaccess
文件本身的位置。
我希望我的 URL 看起来像这样:
example.com/products/123/title-of-this-product
实际的URL是这样的:
example.com/products.php?id=123&title=title-of-this-product
.htaccess
文件正确解释了我的 URL,因此该页面上的用户只能看到干净的 URL。但是,如果我尝试在 products.php
页面上使用 $_GET['id']
,脚本会崩溃,因为它无法识别 URL.
id
.htaccess
代码:
Options +FollowSymLinks +MultiViews
RewriteEngine On
RewriteRule ^([0-9]+)(?:/([^/]*))?/?$ ./products.php?id=&title= [L,NC]
products.php
代码:
$product_id = isset($_GET['id']) ? $_GET['id'] : "Error! I can't find your product!";
如果我想要一个干净的 URL,如何保留 PHP 函数的 URL 参数?
你实际上有两个问题...
MultiViews
(mod_negotiation 的一部分)已启用,服务于products.php
。- 您的
RewriteRule
模式 不正确,与请求的 URL. 不匹配
Options +FollowSymLinks +MultiViews
您需要禁用 MultiViews
(您已明确启用它)。为您的 products.php
文件(没有任何 URL 参数)提供服务的是 MultiViews(mod_negotiation 的一部分),而不是后面的 mod_rewrite 指令。 MultiViews 本质上允许无扩展的 URLs 以最小的努力,然而,它可能是意外冲突的原因(与 mod_rewrite)——就像在这种情况下。
您的 RewriteRule
指令实际上没有做任何事情。如果 .htaccess
文件位于文档根目录中,则 RewriteRule
模式 ^([0-9]+)(?:/([^/]*))?/?$
与请求的 URL (/products/123/title-of-this-product
),所以该指令实际上根本没有被处理(尽管 MultiViews 仍然会覆盖它,即使它被处理了)。
试试这样:
# Disable MultiViews
Options +FollowSymLinks -MultiViews
RewriteEngine On
RewriteRule ^products/([0-9]+)(?:/([^/]*))?/?$ products.php?id=&title= [L,NC]
您从与 RewriteRule
模式 相匹配的 URL-path 开始缺少 products
。在正则表达式的开头没有 products/
它只会匹配你在 /products/
子目录中,即。 /products/.htaccess
。 RewriteRule
指令匹配相对于 .htaccess
文件本身的位置。