带有%20的mod_rewrite .htaccess转换为 -

时间:2013-06-24 15:58:54

标签: .htaccess mod-rewrite friendly-url

我现在已经阅读了几个小时的.htaccess文件了,我想我已经开始明白这个想法,但我仍然需要一些帮助。我发现various answers around但仍不确定如何执行此操作。

据我了解,您为每个页面扩展编写了一个规则,您想要“美化”,所以如果您有something.phpanotherpage.phpthispage.php等他们期待(会收到??)参数,每个都需要自己的规则。这是对的吗?

我想要更改的网站有这样的网址,

maindomain.com/sue.php?r=word1%20word2

并且至少有一个带有两个参数的页面

maindomain.com/kevin.php?r=place%20name&c=person%20name

所以我想做的是

maindomain.com/sue/word1-word2/
maindomain.com/kevin/place-name/person-name/

保留此.php页面并使其看起来像目录。我读过的大多数教程都涉及如何删除传递参数的.php页面。但我想保留它。

我怀疑的问题是,网址的所有.php?r=部分都是相同的,即sue.php?r=kevin.php?r=,而.htaccess根据文件名决定更改哪个网址然后省略它。如果我想保留文件名,我必须更改?r= 这是个人的吗?我希望这是有道理的。到目前为止,我有这个,但我相信它不会起作用。

Options +FollowSymLinks

RewriteEngine On

RewriteRule ^([a-zA-Z0-9]+)/$1.php?r=$1
RewriteRule ^([a-zA-Z0-9]+)/$1.php?r=$1&c=$1

我认为我必须在某个部分或某种方式添加([^-]*)这个,以便它检测到网址的%20部分,但之后如何将其转换为- 。另外,我的$_GET函数如何工作?

我希望我的问题有道理

1 个答案:

答案 0 :(得分:1)

你在这些规则的某个地方错过了一个空间,但我认为你在制定两个单独的规则时有正确的想法。更难的问题是将所有-转换为空格。让我们从转换为GET变量开始:

# check that the "sue.php" actually exists:
RewriteCond %{REQUEST_URI} ^/([a-zA-Z0-9]+)/([^/]+)/?$
RewriteCond %{DOCUMENT_ROOT}/%1.php -f
RewriteRule ^([a-zA-Z0-9]+)/([^/]+)/?$ /$1.php?r=$2 [L,QSA]

RewriteCond %{REQUEST_URI} ^/([a-zA-Z0-9]+)/([^/]+)/([^/]+)/?$
RewriteCond %{DOCUMENT_ROOT}/%1.php -f
RewriteRule ^([a-zA-Z0-9]+)/([^/]+)/([^/]+)/?$ /$1.php?r=$2&c=$3 [L,QSA]

这些将采用看起来像/sue/blah/

的URI
  1. 提取sue部分
  2. 检查/document_root/sue.php是否确实存在
  3. /sue/blah/重写为/sue.php?r=blah
  4. 同样的事情适用于2个字的URI

    类似于/kevin/foo/bar/

    1. 提取kevin部分
    2. 检查/document_root/kevin.php是否确实存在 3将/kevin/foo/bar/重写为/kevin.php?r=foo&c=bar
    3. 现在,要摆脱“ - ”并将它们更改为空格:

      RewriteCond %{QUERY_STRING} ^(.*)(c|r)=([^&]+)-(.*)$
      RewriteRule ^(.*)$ /$1?%1%2=%3\ %4 [L]
      

      这看起来有点乱,但条件与查询字符串匹配,在查询字符串中查找c=r=,与-的值匹配c= 1}}或r=,然后重写查询字符串以将-替换为(请注意,空格被编码为%20)。这将删除GET参数-c值中的所有r个实例,并用空格替换它们。