0

過去 3 時間から、この 301 URL リダイレクトを試していますが、期待どおりに機能しません。これで私を助けてください。.htaccess ファイルのコードは次のとおりです。

Options +FollowSymLinks +SymLinksIfOwnerMatch -MultiViews
RewriteEngine On
RewriteCond %{HTTP_HOST} ^mydomain.com [NC]
RewriteRule ^(.*)$ http://www.mydomain.com/$1 [L,R=301]
RewriteBase /
rewriterule ^(.*)/(.*)\.html$ product.php?id=$1&name=$2 [L]
rewriterule ^deals/(.*)$ details.php?id=$1 [L]
rewritecond %{SERVER_PORT} 80
rewritecond %{REQUEST_URI} publisher.php

Redirect 301 /deals/74/product-name.html http://mydomain.com/74/product-name.html

www.mydomain.com/deals/74/product-name.html と入力すると、「www.mydomain.com/deals/74/product-name.html?id=74&name=product-name」にリダイレクトされます。

URL の後に「?id=74&name=product-name」を追加する理由がわかりません。「www.mydomain.com/deals/74/商品名.html」だけを表示したい

この問題を解決する方法がわかりません。これについてご案内いただければ幸いです。

4

4 に答える 4

1

を使っているからだと思います(.*)/(.*)

これは私がいつも使っているものです:

<IfModule mod_rewrite.c>
    RewriteEngine on

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule . index.php [QSA,L]
</IfModule>

すべての URL は PHP によってチェックされ、書き換えられます (速度が必要な場合は nginx を使用します) が、.htaccess はクリーンである必要があります。読み取りが簡単で、書き換えが簡単です(nginxまたは別のサーバーへ)。

index.php:

if (substr($_SERVER['HTTP_HOST'], 0, 4) != 'www.'){
    $protocol = (substr(PHP_SAPI, 0, 3) == 'cgi' ? 'Status:' : $_SERVER['SERVER_PROTOCOL']);

    header($protocol.' 301 Moved Permanently');
    header('Location: http://www.example.com'.$_SERVER['REQUEST_URI']);

    exit;
}

// Simple path checker
$uri = trim($_SERVER['REQUEST_URI'], '/');
$path = pathinfo($uri);

// Check

if ($path['extension'] == '.html'){
    $_GET['id'] = $path['dirname'];
    $_GET['name'] = $path['filename'];

    include 'product.php';
    exit;
}

if ($path['dirname'] == 'deals'){
    $_GET['id'] = $path['filename']; 

    include 'details.php';
    exit;
}
于 2013-06-01T19:06:12.090 に答える
0

http://httpd.apache.org/docs/current/mod/mod_alias.html#redirectにあるリダイレクト ディレクティブのドキュメントを参照してください。

そこには次のことがわかります。

クライアントがhttp://example.com/service/foo.txtを要求すると、代わりにhttp://foo2.example.com/service/foo.txtにアクセスするように指示されます 。これには、 http://example.com/service/foo.pl?q=23&a=42などの GET パラメータを含むリクエストが含まれ、 http://foo2.example.com/service/foo.pl?にリダイレクトされ ます。 q=23&a=42 . POST は破棄されることに注意してください。

構成の最後のルールは次のとおりです。

Redirect 301 /deals/74/product-name.html http://mydomain.com/74/product-name.html

mod_alias はすべての GET パラメータを追加します

GET パラメータを追加したくない場合は、Rewrite ルールの Redirect ルールを次のように変更できます。

Rewrite ^/deals/74/product-name.html http://mydomain.com/74/product-name.html [R=301]

簡単

于 2013-06-01T19:14:28.707 に答える
0

URL の後に「?id=74&name=product-name」を追加する理由がわかりません。

/deals/74/product-name.htmlこれは、URIが次の両方のルールに一致するためです。

RewriteRule ^(.*)/(.*)\.html$ product.php?id=$1&name=$2 [L]

Redirect 301 /deals/74/product-name.html http://mydomain.com/74/product-name.html

mod_alias と mod_rewriteを混在させるのは得策ではありません。よりきめ細かい制御を行うには、mod_rewrite 自体を使用することをお勧めします。

変更した .htaccess:

Options +FollowSymLinks +SymLinksIfOwnerMatch -MultiViews
RewriteEngine On
RewriteBase /

RewriteCond %{HTTP_HOST} ^mydomain.com [NC]
RewriteRule ^(.*)$ http://www.mydomain.com/$1 [L,R=301]

RewriteRule ^deals/(74/product-name\.html)$ /$1 [L,R=301,NC]

RewriteCond %{REQUEST_URI} !/74/ [NC]
RewriteRule ^([^/]+)/([^.]+)\.html$ /product.php?id=$1&name=$2 [L]

RewriteRule ^deals/(.*)$ /details.php?id=$1 [L]

RewriteCond %{SERVER_PORT} 80
RewriteCond %{REQUEST_URI} /publisher.php [L]
于 2013-06-01T23:29:48.423 に答える
0

まず第一に、応答して私を助けようとしてくれたすべての人に感謝します。約かかりました。自分で解決策を見つけるために一日中。私の答えが誰かを助けることを願っています、

Options +FollowSymLinks +SymLinksIfOwnerMatch -MultiViews
RewriteEngine On
RewriteBase /

RewriteRule ^deals/74/product-name.html$ 74/product-name.html [R=301,L]

RewriteCond %{HTTP_HOST} ^mydomain.com [NC]
RewriteRule ^(.*)$ http://www.mydomain.com/$1 [L,R=301]

RewriteRule ^(.*)/(.*)\.html$ product.php?id=$1&name=$2


rewritecond %{SERVER_PORT} 80
rewritecond %{REQUEST_URI} publisher.php
RewriteRule ^(.*)$ publisher.php [L]

最後の行「RewriteRule ^deals/74/product-name.html$ 74/product-name.html [R=301,L]」を取り、すべての書き換えルールの上に貼り付けたところ、うまくいきました。他の Rewrite ルールと重複していたようです。しかし、最終的には、期待どおりに機能します。

みんなに感謝します。:-)

于 2013-06-02T09:27:51.343 に答える