【发布时间】:2017-03-26 16:50:36
【问题描述】:
我正在尝试设置一个重写规则,将客户访问单个产品页面(php 文件)到单个页面,并将产品名称作为参数传递。旧格式是
http://example.com/product,新格式为http://example.com/store.php?id=product。
我可以使用以下规则
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.+).php$ store.php?url=$1 [QSA,L]
执行重定向,但仅当客户在其原始请求中包含 .php 扩展名时才有效。同样,我可以使用这条规则:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php
消除用户输入扩展名的需要,但我一直无法成功地将两者结合起来。我尝试将第一条规则更改为
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.+).$ store.php?url=$1 [QSA,L]
但这也会重定向图像和样式表,使网站无法使用。
更改我的 .htaccess 文件以满足这两个目标的最佳方法是什么(不需要扩展名,重定向到以原始页面名称作为参数的单个页面)?
提前致谢!
【问题讨论】:
-
是否所有单独的产品页面都位于与客户单击产品以转到该单独产品页面的主商店页面不同的目录中?
-
@Kobbe 不,所有页面都在站点的根目录中。
-
我问的原因是我会采取不同的方法。如果所有产品页面都在同一个目录中,您可以简单地更改该目录的名称,例如通过在名称前添加“x”。由于服务器找不到产品,它将触发 404。使用自定义 404 页面,您可以使用 $_GET[] 从 URL 中获取参数并从那里重定向并重定向所有其他不包含某些字符的请求在另一个 404 页面的 URL 中,用于不是产品页面的失败请求。你明白我的意思吗?
-
产品页面与主商店页面位于同一目录的问题在于,您无法通过简单地更改它们所在目录的名称来禁用所有产品页面。
-
不过,如果您只有 10 或 20 个产品页面,您可以通过更改产品页面的名称来触发 404。如果您有数百个产品页面,那么能够更改目录名称才很重要。