-1

私は文字通りこれで私のテザーの終わりにいます。stackoverflow に関する他の多くの質問と回答を調査しましたが、必要な解決策が見つかりません。自分がやりたいことは不可能だと思い始めています。

では・・・問題はこれです。私は次のようにしたい:例えば

www.mydomain.com/visa-information/country.php?country={COUNTRY-NAME}&passport={PASSPORT-NAME}

次のきれいな URL に:

www.mydomain.com/visa-information/{COUNTRY-NAME}-visa-for-{PASSPORT-NAME}-citizens/

htacces ファイルに部分的に成功したルールがあります。

RewriteRule ^/visa-information/([A-Za-z-]+)-visa-for-([A-Za-z-]+)-citizens/?$ visa-information/country.php?country=$1&passport=$2  [NC]

これは正常に機能し、ブラウザのアドレスバーにURLを入力すると必要なことを実行しますが、私が抱えている本当の問題は、ほとんどすべてのページにあるフォームを介してきれいなURLにリダイレクトすることです.サイト。

以下のようなさまざまなリダイレクトルールを試しました。

RewriteCond %{QUERY_STRING} country=([A-Za-z-]+)&passport=([A-Za-z-]+) [NC]
RewriteRule visa-information/country.php  visa-information/%1-visa-for-%2-citizens/? [R,NC,L]

しかし、運がありません。また、上記のリダイレクト ルールに QSA フラグを追加しようとしましたが、無限ループになってしまいます。

country.php ページの上部にある location php リダイレクト ヘッダーを使用して、フォーム送信後に次のようにリダイレクトしようとしました。

if(isset($_GET['country']) && isset($_GET['passport'])) {
header("Location: " . $dir . "/visa-information/" . $currentCountry . "-visa-for-" . $currentPassport . "-citizens/");
exit();
}

私は上記がブラウザーに直接きれいなURLを入力するように機能することを期待していましたが、そうではなく、404エラーが発生するだけです。

どんな助けでも大歓迎です。

ありがとう

ヨルダシュ

編集

私のローカルディレクトリ構造は次のとおりです。

/webserver/mydomain.com/visa-information/etc...

ライブサーバーでは次のようになります。

mydomain.com/visa-information/etc..

ローカル マシンで Apache Alias を使用しているため、RewriteBase を次のように設定しました。

RewriteBase /webserver/mydomain.com/

私は現在、anubhavaが私に与えたものから適応された次のRewriteRulesのセットを持っています:

RewriteCond %{REQUEST_URI} visa-information/country.php     [NC]    
RewriteCond %{QUERY_STRING} country=([A-Za-z-]+)&passport=([A-Za-z-]+)  [NC]
RewriteRule visa-information/       visa-information/%1-visa-for-%2-citizens/? [R=301,L,QSA]

# internal redirect from pretty URL to old URL
RewriteRule ^visa-information/([A-Za-z-]+)-visa-for-([A-Za-z-]+)-citizens/?$    visa-information/country.php?country=$1&passport=$2 [NC,L]

これにより、現在、ブラウザー バーにプリティ URL を入力するときとフォームを使用するときの両方で、エンドレス リダイレクト ループが発生しますが、上位 3 つのルールを無効にすると、プリティ URL をアドレス バーに入力して、書き換えは機能しますが、もちろんフォームの送信からではありません。

何が間違っているのか本当にわかりません。なぜ無限ループがあるのですか?

4

2 に答える 2

0

RewriteRuleの先頭のスラッシュと一致しないため、最初のルールがどのように機能するかわかりません.htaccessTHE_REQUESTまた、古い URL をプリティ URL にリダイレクトするには、Apache がブラウザから受け取った元のリクエストを表す変数を使用する必要があります。コードを次のように置き換えます。

Options +FollowSymLinks -MultiViews
RewriteEngine On
RewriteBase /

# external redirect from old URL to pretty URL
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+visa-information/country\.php\?country=([^\s&]+)&passport=([^\s&]+)\s [NC]
RewriteRule ^ /visa-information/%1-visa-for-%2-citizens/? [R=301,L]

# internal redirect from pretty URL to old URL
RewriteRule ^visa-information/([a-z-]+)-visa-for-([a-z-]+)-citizens/?$ /visa-information/country.php?country=$1&passport=$2 [NC,L,QSA]
于 2013-10-02T17:14:48.517 に答える
0

問題は実際には mod_Rewrite ルールではなく、私の php フォームにあったようです。フォーム「action」は同じフォーム ページ ($SERVER['PHP_SELF'] など) を指していましたが、これは書き換えルールなしで正常に動作しますが、アクティブ化すると無限ループが発生します。

私は単純に search_action.php ページを作成し、そこにあるフォームを php ヘッダーを使用してきれいな URL にリダイレクトしました。

header("Location: " . $dir . "/visa-information/" . $currentCountry . "-visa-for-" . $currentPassport . "-citizens/");
exit();

私が最初に持っていた mod_rewrite ルールは正常に機能し、ユーザーはフォームからきれいな URL を使用するか、ブラウザーのアドレス バーに直接入力することで、目的のページにアクセスできるようになりました。

フォームからの中間アクションページまたはJavascriptを使用せずに、クエリ文字列を書き換えながらフォームを同じページにアクションすることが実際に可能かどうかはわかりません。経験豊富なプログラマーの多くはこれをすでに知っていると思いますが、残念ながら私は知りません。

于 2013-10-07T13:20:48.513 に答える