1

mod_rewrite は初めてですが、きれいな URL でサイトを修正するために最善を尽くしています。

RewriteRule を使用すると、クリーンな URl を入力して適切なページにアクセスできるようになりますが、「乱雑な」URL が使用された場合にクリーンな URL に自動的にリダイレクトされるという問題があります (これは、ユーザーが送信したリンクやコンテンツなど)

さて、私は別の .htaccess フォーラムで見つけたこのコードを持っています。ある状況では機能しますが、別の状況では機能しません。説明します:

# FORCE CLEAN URLS
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+index\.php\?(.*)=([^\s]+) [NC]
RewriteRule ^ %1\/%2? [R=301,L]

これは、次のようなアドレスで正常に機能します。たとえば、www.domain.com /index.php?cmd=login 自動的にwww.domain.com/cmd/loginにリダイレクトされます。

しかし、次のような複数のクエリがある場合に問題が発生します: www.domain.com/index.php?cmd=view-profile&user=bob

アドレスに最大 3 つ以上のクエリがある可能性がある場合に、そのような URL を整理する方法がわかりません。私は正規表現に完全に対応できるわけではないので、これまでのところ、コード スニペットを修正しようとしても失敗しています。

どんな助けでも大歓迎です!私はそれらを 301 リダイレクトにして、サイトが適切にインデックスされ、SEO に準拠できるようにしたいと考えています。

編集

正規表現を数時間いじった後、私は進歩しましたが、また困惑しました。

これを表現すると:

index\.php\?(.*)=([^\s]+)(&(.*)=([^\s]+))?+
$1/$2/$3/$4/$5

index.php 以降の 3 つの URL に一致します。

http://site.com/index.php?cmd=shop&cat=78

http://site.com/index.php?cmd=shop

http://site.com/index.php?cmd=shop&cat=78&product=68

しかし、結果の出力は、それが何であるかによって異なります。これらは私の結果です:

http://site.com/cmd=shop&cat/78///

http://site.com/cmd/shop///

http://site.com/cmd=shop&cat=78&product/68///

特定の部分をオプションとして扱い、適切にグループ化する方法は確かです。

4

1 に答える 1

1

パラメータのペアの数ごとに個別に処理する必要があります。あなたが持っているものを使用して、1 つの名前と値のペアを処理し、2 と 3 (および必要に応じて 4) に対して同様にアプローチできます。

# To handle a single name/value pair in the query string:

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+index\.php\?([^&=]+)=([^&\ ]+)(\ |$) [NC]
RewriteRule ^ /%1\/%2? [R=301,L]

# To handle 2:

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+index\.php\?([^&=]+)=([^&\ ]+)&([^&=]+)=([^&\ ]+)(\ |$) [NC]
RewriteRule ^ /%1\/%2/%3/%4? [R=301,L]

# To handle 3:

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+index\.php\?([^&=]+)=([^&\ ]+)&([^&=]+)=([^&\ ]+)&([^&=]+)=([^&\ ]+)(\ |$) [NC]
RewriteRule ^ /%1\/%2/%3/%4/%5/%6? [R=301,L]

基本的に、リクエストの終わりをチェックする&([^&=]+)=([^&\ ]+) (\ |$)に別のものを追加/%#/%#し、ターゲット URI の最後に別のものを追加します。ここで、#は適切にインクリメントされた後方参照です。

于 2013-01-29T00:47:59.677 に答える