mod_rewrite到php文件,除非目录存在

时间:2012-05-10 06:44:40

标签: .htaccess mod-rewrite query-string

我有一个mod_rewrite规则,用于将不存在的目录定向到php文件,该文件根据$ 1执行数据库获取。

一切正常,除非目录确实存在,它显示正确的目录,但它也会在不需要时附加查询字符串。

过去几个小时我一直在网上搜索并尝试不同的方法而没有运气。

有谁知道如何保持这种功能原样,但摆脱查询字符串?

非常感谢。

这是我的代码:

RewriteEngine On
    Options +FollowSymlinks
    RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([0-9a-zA-Z\-]+)/$ $1 [R]
RewriteRule ^([0-9a-zA-Z\-]+)$ product.php?product=$1

最终发生的事情是浏览器将网址显示为http://domain.com/existing_dir/?product=existing_dir

2 个答案:

答案 0 :(得分:2)

尝试一下,它会自行删除/而不重复整个过程

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*?)/?$ product.php?product=$1

如果你坚持限制特殊字符,那就可以:

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^([0-9a-zA-Z\-]+?)/?$ product.php?product=$1

+是一次或多次重复,*为0或更多,+?*?是不饥饿匹配的修饰符 - 它允许/?匹配任何东西

另外在你的例子中,第一个RewriteRule是有条件地执行的(当目录不存在时),第二个一直执行(如果第一个不会破坏进程),所以即使目录存在

答案 1 :(得分:0)

Mod_rewrite不会影响查询字符串,除非您告诉mod_rewrite有一个空查询字符串,否则它将始终标记在新URL的末尾。这是通过添加一个?在新字符串的末尾。所以第一行应该是这样的:

RewriteRule ^([0-9a-zA-Z\-]+)/$ $1? [R]
相关问题