2

保持したい文字列の前後の文字列を削除して、以下の URL を書き直す必要があります。リダイレクトするこのような URL が 30,000 あるので、これを効率的に行う必要があります。

正規表現ルールを使用して、必要な文字列の前にある文字列を削除できることはblah-blah-blah-the-post-title 知っていますが、残りの&catid=210:the-category-title&Itemid=7891011. そして、末尾にスラッシュを追加する必要があります。

つまり、この URL パターンをリダイレクトする必要があります

http://www.domain.com/index.php?option=com_content&view=article&id=123456:blah-blah-blah-the-post-title&catid=210:the-category-title&Itemid=7891011

このパターンに

http://www.domain.com/blah-blah-blah-the-post-title/

grepを使用して.htaccessでこれを行うことは可能ですか? それともphpを使ったほうがいいですか?

そして、phpの場合、どのように?(ここでは正規表現とphp初心者の両方)。

4

2 に答える 2

1

これはあなたが探していることをするはずです。variable のサーバー変数クエリ文字列%{QUERY_STRING}を解析しています。変数の最初の部分は必要ないため、RegEx グループ内でキャプチャするつもりはありません。括弧内の部分は、探しているものでなければなりません。また、文字以外のものを探して、クエリ文字列内の他の変数の前に終了しようとします。次に、可能なリテラル文字を探します。GETid()&&

を使用し%1てキャプチャした文字列をルールにエコーし、次にスラッシュとマークを追加し?て、 の動作とは異なることを示し[QSA] Query String Appendます。リダイレクトが必要であることを伝えているので、リダイレクトを渡しRますL。永続的なリダイレクトにしたい場合は、[R=301].

RewriteEngine On
RewriteBase /
RewriteCond  %{QUERY_STRING} id=\d+:([^&]+)&?
RewriteRule .* %1/? [R,L]

.htaccessの方が優れています (より高速です) が、PHP でこれを行うには、最初にこのリンクを作成するコードを編集する必要があります。ただし、ページの読み込み後にページ上のこのリンクを変更しようとしている場合は、これを行うことができます (ページの上部で):

if(preg_match('!^/index\.php!',$_SERVER['REQUEST_URI'])){
   if(!empty($_GET['id'])){
       $id=$_GET['id'];
       $parts = explode(':',$id);
       $newPath = 'Location: /'.$parts[1].'/';
       header($newPath);
       exit();   
   }
}
于 2013-08-19T01:27:52.717 に答える
0

更新: .htaccess を使用すると、パラメーターにアクセスできるかどうかわかりません。また、必要だとは思いませんか?ユーザーに別のページを表示したい場合は、以下のコードを見てください。

PHP を使用する場合は、次のようになります。

<IfModule mod_rewrite.c>
    Options +FollowSymLinks
    RewriteEngine on

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
</IfModule>

あなたの.htaccessで次のようになります:

http://www.domain.com/blah-blah-page/

次のようなものに:

http://www.domain.com/index.php?url=blah-blah-page

QSA は基本的に、指定されたパラメーターを保持することを意味します。たとえば、次のようになります。

http://www.domain.com/blah-blah-page/?test=hej 

になります:

http://www.domain.com/index.php?url=blah-blah-page&test=hej

次に、PHP で次のようにします。

if (isset($_GET['url']) && !empty($_GET['url'])) {
    $url = $_GET['url'];
    unset($_GET['url']);
    $v = explode('/', $url);

    $lowerCaseAction = strtolower($v[0]);
}

これが正しい軌道に乗るのに役立つことを願っています。

于 2013-08-19T01:06:34.510 に答える