我有以下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/4
或somepage/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]