1

私は .htaccess ファイルについて数時間読んでいて、アイデアを理解し始めていると思いますが、まだ助けが必要です。SOに関するさまざまな 回答が 見つかりましたが、これを行う方法はまだわかりません。

私が理解している限りでは、「整形」したいページ拡張機能ごとにルールを書くのでsomething.phpanotherpage.phpthispage.phpなどがあり、それらが引数を期待している (受け取る??) 場合、それぞれに独自のルールが必要です。これは正しいです?

変更したいサイトはこのようなURLで、

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

2 つの引数を持つ少なくとも 1 つのページ

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

([^-]*)そして、URLの一部を検出できるように、これを何らかの方法で追加する必要があると思い%20ますが、どうすれば-. また、私の機能はどのように$_GET機能しますか??

私の質問が理にかなっていることを願っています

4

1 に答える 1

1

これらのルールのどこかにスペースがありませんが、2 つの別々のルールを作成するという正しい考えを持っていると思います。-難しい問題は、すべてをスペースに変換することです。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. 実際に存在することを確認する 3への/document_root/kevin.php書き換え/kevin/foo/bar//kevin.php?r=foo&c=bar

ここで、「-」を削除してスペースに変更するには:

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

これは少し乱雑に見えますが、条件はクエリ文字列に一致し、クエリ文字列で または を検索し、またはc=の値で a とr=照合し、クエリ文字列を書き直してを aに置き換えます(スペースは次のようにエンコードされることに注意してください)。 a )。これにより、GET パラメータの値からすべてのインスタンスが削除され、スペースに置き換えられます。-c=r=-%20-cr

于 2013-06-24T16:14:21.263 に答える