1

我已经阅读 .htaccess 文件几个小时了,我想我开始明白了,但我仍然需要一些帮助。我在 SO周围找到了各种 答案 ,但仍然不确定如何做到这一点。

据我了解,您为要“美化”的每个页面扩展编写了一条规则,因此,如果您有something.php,anotherpage.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=url 的所有部分都是相同的sue.php?r=,即kevin.php?r=.htaccess 根据文件名决定要更改哪个 URL,然后将其省略。如果我想保留文件名,我是否必须更改它?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

而且我认为我必须以([^-]*)某种方式或某种方式添加它,以便它检测到%20URL 的一部分,但是我该如何将它转换为-. 另外,我的$_GET功能将如何工作?

我希望我的问题有意义

4

1 回答 1

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]

这些将采用如下所示的 URI /sue/blah/

  1. 提取sue零件
  2. 检查是否/document_root/sue.php确实存在
  3. 改写/sue/blah//sue.php?r=blah

同样的事情适用于 2 字 URI

/kevin/foo/bar/

  1. 提取kevin零件
  2. 检查/document_root/kevin.php实际存在 3 重写/kevin/foo/bar//kevin.php?r=foo&c=bar

现在,摆脱“-”并将它们更改为空格:

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

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

于 2013-06-24T16:14:21.263 回答