使用.htaccess清洁URL和可能的建议


Clean URL using .htaccess and possible suggestions

我有以下url:

http://mywebsite.com/somepage.php?product=343&type=4

我希望用户能够输入:

http://mywebsite.com/somepage?product=343&type=4

角色应该处理子目录和不同文件名中的页面(不仅仅是Somepage或子域)。例如:

http://mywebsite.com/subdomain/somepage.php?product=343&type=4

可以通过输入

来访问

http://mywebsite.com/subdomain/somepage?product=343&type=4

我也想知道这样的链接是否可以更干净?

这将接受任何不指向文件或目录的请求,如果.php文件存在,则附加".php"。

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule (.*) $1.php [L]

当目标文件存在时,只需重写请求即可解决问题。

我还没有测试过,但它可能有效。

RewriteEngine On
RewriteBase /
RewriteRule ^somepage(.*)$ somepage.php [QSA,L]

虽然正确的方法通常被接受为使用.htaccess的URL重写,如@Nathan所示,您也可以选择在每个目录的基础上使用MultiViews:

<Directory /home/www/sitename/htdocs>
Options + MultiViews
</Directory>

Multiviews,在404从一个未知的文件扩展名,将开始在文件名中搜索匹配。也就是说,如果URI是foo,它将查找foo.*;也就是说,它可能会找到foo.gif, foo.jpg, foo.html等,并将返回最高质量的选项。

如果您确定可以以唯一名称提供所有内容(应该不难),那么请务必使用此方法。然后把所有的锚都改成指向somepage?product=343&type=4而不是somepage.php?product=343&type=4

编辑:

是的,这样的链接可以做得更干净。使用URL重写,您可以将URL重写为:

somepage/product/343/type/4somepage/343/4

这由适当的(各自的)正则表达式完成:

   RewriteCond %{REQUEST_FILENAME} !-f
   RewriteCond %{REQUEST_FILENAME} !-d
   RewriteRule ^(.*)/(.*)/(.*)/(.*)/(.*)$ $1.php?$2=$3&$4=$5 [L,QSA]

   RewriteCond %{REQUEST_FILENAME} !-f
   RewriteCond %{REQUEST_FILENAME} !-d
   RewriteRule ^(.*)/(.*)/(.*)$ $1.php?product=$2&type=$3 [L,QSA]