2016-05-02 15 views
0

誰かがコメントする前に、このトピックで作成された多くの投稿があることを知っていますが、そのいずれも問題を解決していないようです。.htaccessを使用してGET URLを消去する

だから、私はそうのようなGETクエリで使用されているproject.phpと呼ばれるウェブサイト内のページを持っている:project.php?id=12私はlocalhost/MyWeb/project/id/12/に指定されたURLに変換した.htaccessファイルを持っていると思います。私は文字通り、そのトピックに関するすべての単一の投稿をたどってきましたが、どれも動作していないようです。

はまた、それに伴い、私はすべての私の.php.htmlファイルはその名前だけで表示させたい、すなわちlocalhost/MyWeb/index.php/localhost/MyWeb/index/なり、localhost/MyWeb/sub1/sub2.phplocalhost/MyWeb/sub1/sub2/になります。

編集:私はそれがどの参考になるとは思いませんでしたので、私は最初の場所で私の仕事を追加しなかった理由

理由でした。しかし、ここにある:まず

RewriteEngine On 

RewriteRule ^([0-9]+)$ project.php?id=$1 
RewriteRule ^([0-9]+)/$ project.php?page=$1 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^([^\.]+)$ $1.php [NC,L] 
RewriteRule ^([^\.]+)$ $1.html [NC,L] 
+0

これまでの試みや具体的な研究を示してください。前もって感謝します! – mario

+0

私は自分の作品を最初に追加しなかったのは、それが役に立たないと思ったからです。しかし私は私のポストを更新しました。 –

+0

@TayabSoomro - あなたの試行を投稿する理由は、私たちにとって役に立ちます。なぜなら、あなたが求める答えを提供するのではなく、どこが間違っているのかを示す機会を提供するからです。しかしそれはただの理由です...コードを投稿したので、あなたが間違っていたことが分かりました。今すぐ回答を投稿する –

答えて

2

、あなたがRewriteBaseを設定する必要があることを意味し、サブディレクトリ(MyWeb)、外に動作しています。また、.htaccessファイルがローカルホストのドキュメントルートではなくそのサブディレクトリに配置されていることを確認する必要があります。だから、

RewriteEngine onの下、folloeing行を挿入:

RewriteBase /MyWeb/ 

次に、あなたがproject/id/{id}project.php?id={id}を変換したいと述べたが、あなたのコードは/id/セグメントを省略します。私はあなたに2つのルールがあることに気付きました。そして、2番目のルールはあなたの質問と矛盾しているので、2番目のルールが何であるかを明確にするまで、最初のルールのために必要な変更を示します。

に非常に最初のルール変更、プロジェクトURIを機能させるために:

RewriteRule ^project/id/([0-9]+)/?$ project.php?id=$1 [QSA,L] 

これはオプションの末尾のスラッシュで、あなたが望むURIと一致しますが。また、QSAフラグを追加しました。追加のクエリ文字列パラメータは、rewitten URIに加え、Lフラグも追加して、ルールが一致した場合に処理を停止します。

次に、あなたのURIから.phpまたは.html省略する最後の3行を変更するには、以下:あなたはlocalhost/MyWeb/indexにリクエストを行うと、Apacheはlocalhost/MyWeb/index.phpまたはlocalhost/MyWeb/index.htmlが存在するかどうかをチェックします

RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule ^([^\.]+)$ $1.php [L] 

RewriteCond %{REQUEST_FILENAME}.html -f 
RewriteRule ^([^\.]+)$ $1.html [L] 

最初に見つけたものを提供します。

PHPファイルとHTMLファイルの両方がある場合は、PHPファイルが提供され、HTMLファイルは提供されません。 HTMLファイルを提供したい場合は、2つのブロックを交換してください。

残念ながら、私はこれらのために後続のスラッシュを強制的に適用する良い方法は知らない。具体的には、その存在をチェックする条件のためです。言い換えれば、sub2/を要求するとトレイルラインがスラッシュで表示されますが、それはsub2/.phpが存在するかどうかを確認する必要があるため動作しません。

更新:は、追加の利益のために、ちょうどあなたがまだ仕事に新しいURIに書き換えを許可しながら、新しいものに古いURIをリダイレクトするために、以前の設定新しいRewriteBaseの下にこれらの二つのブロックを置く:

RewriteCond %{THE_REQUEST} \/project\.php\?id=([0-9]+) [NC] 
RewriteRule^project/id/%1/ [R=302,L,QSD] 

RewriteCond %{THE_REQUEST} \/MyWeb/(.+)\.(php|html) 
RewriteCond %{REQUEST_FILENAME} -f 
RewriteRule^%1 [R=302,L] 

参考にしてください:http://hastebin.com/gacapesoqe.rb

+1

答えをありがとう、非常に有用で説明的です。あなたが知っているソースがありますか? –

+0

オンラインのリソースはたくさんあります。おそらく[this](http://stackoverflow.com/questions/20563772/reference-mod-rewrite-url-rewriting-and-pretty-links-explained)で始めることができます。 –

関連する問題