【问题标题】:.htaccess - url rewrite that drops extension and passes argument.htaccess - 删除扩展名并传递参数的 url 重写
【发布时间】:2013-10-13 12:47:46
【问题描述】:

我正在寻找可以转换以下网址的一系列 .htaccess 语句

http://mysite.com/product           to http://mysite.com/product.php
http://mysite.com/product/55            to http://mysite.com/product.php?id=55
http://mysite.com/category/38           to http://mysite.com/category.php?id=38
http://mysite.com/resources/car/19      to http://mysite.com/resources/car.php?id=19
http://mysite.com/resources/car/19?color=red&year=2013  to http://mysite.com/resources/car.php?id=19&color=red&year=2013

换句话说,在我的网站中呈现 php 文件时,我想删除 .php 扩展名。如果 url 以数字结尾,那么我想将其作为 id 查询字符串参数传递。我还想将所有常规查询字符串参数传递给我的 php 文件,例如 coloryear

我不确定如何构建这样的 .htaccess 文件。

附加说明 我目前正在使用 hte following,但它没有考虑带有数字的网址,并将其作为 id

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteCond %{QUERY_STRING} (.*)
RewriteRule . %{REQUEST_FILENAME}.php?%1 [L]

如果我可以在第二行替换 REQUEST_FILENAME 中的尾随数字,那就太好了。

【问题讨论】:

标签: regex .htaccess


【解决方案1】:

首先,您需要确保多视图已关闭。然后你需要 3 套重写规则:

Options -Multiviews
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)$ /$1.php [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/([0-9]+)$ /$1.php?id=$2 [L,QSA]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^resources/([^/]+)/([0-9]+)$ /resources/$1.php?id=$2 [L,QSA]

如果网址实际上只是“产品”、“类别”和“汽车”,您可以更具体一点,那么您可以:

Options -Multiviews
RewriteEngine On

RewriteRule ^product$ /product.php [L]

RewriteRule ^(product|category)/([0-9]+)$ /$1.php?id=$2 [L,QSA]

RewriteRule ^resources/car/([0-9]+)$ /resources/car.php?id=$1 [L,QSA]

约翰(操作员)说:

这是我最终得到的 .htaccess 文件

RewriteEngine On
Options -Multiviews

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{QUERY_STRING} (.*)
RewriteRule ^(.*)\/([0-9]+)$ $1.php?id=$2&%1 [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{QUERY_STRING} (.*)
RewriteRule ^(.*)$ $1.php?%1 [L]

【讨论】:

  • 如果我有一个像 mysite.com/dir1/dir2/dir3/helloworld 这样的 URL 需要映射到 mysite.com/dir1/dir2/dir3/helloworld.php。我需要为它写另一套 RewriteRule 吗?基本上每次我添加新目录或子目录时,我都需要编写新规则?
  • @John 如果有任意数量的目录,您可以摆脱第三条规则(正则表达式为^resources/([^/]+)/([0-9]+)$),然后将其他两个的正则表达式从^([^/]+) 更改为^(.*).
  • 效果很好。我还需要先设置第二组规则,否则我会收到 500 内部服务器错误。日志说它重定向了太多次。
猜你喜欢
  • 1970-01-01
  • 2014-12-22
  • 1970-01-01
  • 2014-01-25
  • 2022-03-04
  • 1970-01-01
  • 2012-03-18
  • 2015-03-14
  • 2019-04-21
相关资源
最近更新 更多