再次尝试这个,因为我意识到我的帖子非常糟糕。
我有一个Product1.php页面,它是动态的,用于从数据库中填充我的产品。
这是我的SEO友好网址的标题:
http://www.example/category/subcategory/model_name-model_id/product_id
这是带有查询字符串的原始网址,它会重写为:
http://www.example.com/Product1.php?=Product_ID=1
这是我在htaccess中的重写功能,可以实现这一点:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^category/.*/.*/([0-9]+)$ Product1.php?Product_ID=$1 [L,QSA]
但是,如果用户在地址栏中手动输入http://www.example.com/Product1.php?=Product_ID=1
,则他们仍会看到这一点。此外,对于搜索引擎机器人来说也是如此,它将我的页面值除以。
如何编写301重定向强制用户和机器人仅查看SEO友好网址,无论他们如何访问该网页?我已经研究了几天和我试过的各种解决方案只给我404或500个错误。
请帮忙。提前谢谢。
**编辑:好的,看起来我无法调用RewriteMap,因为我无法访问我的主机的配置文件。 (需要升级我们的帐户才能这样做而且雇主不愿意。)因此,必须为每个页面执行重写规则,这是不幸的但是可行的。
但仍需要了解如何强制重定向导致404或500错误。任何人吗strong>
答案 0 :(得分:0)
我使用了一个小技巧添加"内部"负责主重写的规则的参数,以及301重定向中此参数的检查。具有环境变量的解决方案还允许处理可以以任何顺序呈现参数的请求。
RewriteEngine on
# perform collecting parameters from query string to an environment variables
RewriteCond %{QUERY_STRING} Category=([^&]+)
RewriteRule . - [E=category:%1]
RewriteCond %{QUERY_STRING} SubCategory=([^&]+)
RewriteRule . - [E=subcategory:%1]
RewriteCond %{QUERY_STRING} Product_ID=([^&]+)
RewriteRule . - [E=productid:%1]
#...etc...
# give a right 301 redirect
RewriteCond %{REQUEST_URI} Product1.php
# make sure it's not an internal redirect
RewriteCond %{QUERY_STRING} !^Internal=1(.*)$
RewriteRule . /%{ENV:category}/%{ENV:subcategory}/%{ENV:productid}/? [L,R=301]
# now rewrite rule with the additional "Internal" parameter to label it as an internal redirect
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} ([^/]+)/([^/]+)/([^/]+)
RewriteRule .* Product1.php?Internal=1&Category=%1&SubCategory=%2&Product_ID=%3 [L]
因此,以下请求
/Products1.php?Category=cat1&SubCategory=subcat1&Product_ID=321
将导致301重定向到
/cat1/subcat1/321/
将显示相应的页面。
另一种方法是删除"内部"技巧并使用脚本的另一个名称,例如Products2.php。即你需要一些东西来区分外部请求和内部重写。避免无限循环("重定向太多"错误)。