0

URLを書き直そうとしています:

RewriteEngine On
RewriteBase /

RewriteRule ^help/(.+)/(.+) help.php?helpid=$2
RewriteRule ^city/(.+)/(.+) city.php?cityid=$2

さらに、URL には期待される形式が含まれています: http://example.com/help/the-irelevant-title/5/

のようだ

isset($_GET['helpid']))常に発砲falseしますhelp.php

通常、このシステムは私にとってはうまくいきました。私がここに欠けているものはありますか?

-編集-

これが機能するはずです(または少なくとも1人が答えていることがわかります)ので、質問にコードを追加しています:

完全な .htaccess コンテンツ

RewriteEngine On

ErrorDocument 500 /oohps.php
ErrorDocument 404 /oohps.php

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

RewriteBase /

RewriteRule ^help/([^/]+)/([^/]+) help.php?helpid=$2 [QSA]
RewriteRule ^city/([^/]+)/([^/]+) city.php?cityid=$2 [QSA]

RewriteRule ^login$ login.php

help.php の始まり

session_start();
error_reporting(E_ALL);
ini_set('display_errors', '1');
$_GET['noseo'] = true;
include('htmlhead.php');
/* Leemos la id del grupo*/
$selected;
if(isset($_GET['helpid'])){
    $selected = $_GET['helpid'];
}else {
    echo '<script>alert("Modrewrite fails. Id is missing, id: '.$_GET['helpid'].'");location.href = "/"</script>';   /* Allways returns this*/
}
4

4 に答える 4

3

正規表現は、スラッシュと一致する最初の部分で貪欲.+すぎて、正規表現の残りの部分が失敗します。[^/]+正規表現は、スラッシュ以外のものと一致します。

RewriteRule ^help/([^/]+)/([^/]+) help.php?helpid=$2
RewriteRule ^city/([^/]+)/([^/]+) city.php?cityid=$2
于 2013-02-22T20:10:22.953 に答える
2

を使用[QSA]すると、GET パラメータを転送できます。また、.+(greedy) を[^/]+(1 回以上繰り返されるスラッシュではない任意の文字を意味する) に変更すると、問題が解決するはずです。

RewriteRule ^help/([^/]+)/([^/]+) help.php?helpid=$2 [QSA]
RewriteRule ^city/([^/]+)/([^/]+) city.php?cityid=$2 [QSA]

次のように短縮することもできます。

RewriteRule ^(help|city)/([^/]+)/([^/]+) $1.php?$1id=$3 [QSA]

Apacheマニュアルから

置換 URI にクエリ文字列が含まれている場合、RewriteRule の既定の動作では、既存のクエリ文字列が破棄され、新しく生成されたクエリ文字列に置き換えられます。[QSA] フラグを使用すると、クエリ文字列が結合されます。

次のルールを検討してください。

RewriteRule /pages/(.+) /page.php?page=$1 [QSA]

[QSA] フラグを使用すると、/pages/123?one=two のリクエストは /page.php?page=123&one=two にマップされます。[QSA] フラグがないと、同じリクエストが /page.php?page=123 にマップされます。つまり、既存のクエリ文字列は破棄されます。

于 2013-02-22T20:09:06.937 に答える
1

ルート ディレクトリの .htaccess ファイルでこれを試すことができます。

Options +FollowSymlinks -MultiViews
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI}  ^/([^/]+)/[^/]+/([^/]+)/?  [NC]
RewriteRule .*              %1.php?%1id=%2             [L]

リダイレクト

http://domain.com/par1/anything/par2末尾のスラッシュの有無にかかわらず

http://domain.com/par1.php?par1id=par2

Stringspar1は動的であると想定されており、質問の例によると anything、PHP スクリプトの名前であり、リダイレクトされたクエリの名前の最初の部分でもあります。par2par1key

par1= helpの場合の例:

リダイレクト:

http://domain.com/help/the-irelevant-title/5/

に:

http://domain.com/help.php?helpid=5

永続的なリダイレクトの場合は、次のように置き換え[L]ます[R=301,L]


私は他のルールをテストしておらず、それらが期待どおりに機能するかどうかもわかりませんが、質問の .htaccess ファイルを次のように変更して、この回答にルールセットを含める必要があります。

Options +FollowSymlinks -MultiViews
RewriteEngine On
ErrorDocument 500 /oohps.php
ErrorDocument 404 /oohps.php

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

RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI}  ^/([^/]+)/[^/]+/([^/]+)/?  [NC]
RewriteRule .*              %1.php?%1id=%2             [L]

# Next line is a suggested addition to prevent loops.
RewriteCond %{REQUEST_URI}  !login\.php [NC]
RewriteRule ^login$   login.php         [L]
于 2013-02-25T05:02:32.713 に答える
1

変数が 2 つある理由はありますか? これはうまくいきます:

RewriteEngine On
RewriteBase /    
RewriteRule ^help/([^/\.]+)/([^/\.]+)/?$ help.php?helpid=$2 [L]
RewriteRule ^city/([^/\.]+)/([^/\.]+)/?$ city.php?cityid=$2 [L]
于 2013-02-22T20:08:26.813 に答える