2

stackoverflow のようにページ拡張機能を非表示にしたい。以下はどのように機能しますか?

http://stackoverflow.com/tags/foo
http://stackoverflow.com/tags/bar

これを行う多くのサイトを見てきましたが、これがどのように達成されるかはまだわかりません (私は LAMP スタックを持っています)。

4

6 に答える 6

6

Web サーバーが URL の要求を受け取ると、その処理方法を決定する必要があります。従来の方法では、URL の先頭をファイル システム内のディレクトリにマップし、残りの URL でファイル システム内のファイルに移動します。その結果、URL にはファイル拡張子が付いていました。

しかし、そのようにする必要はなく、ほとんどの新しい Web フレームワークはそうではありません。URL をコードにマップして実行する方法をプログラマーが定義できるようにするため、応答を提供する単一のファイルがないため、ファイル拡張子は必要ありません。

あなたの例では、ファイル「foo」と「bar」を含む「tags」ディレクトリはありません。「タグ」URL は、タグ データのデータベースに対するクエリのパラメータとして URL の残りの部分 (「foo」または「bar」) を使用するコードにマップされます。

于 2009-11-18T22:11:26.840 に答える
3

あなたが望むのはクリーンな URL で、apache と .htaccess でそれを行うことができます。もっと良い方法があるかもしれませんが、私が行っている方法は次のとおりです。

http://evolt.org/Making_clean_URLs_with_Apache_and_PHP

于 2009-11-18T22:03:05.603 に答える
2

それがASP.NET MVCの美しさと働きです。

「非表示」はありません。これは、ASP.NET MVC が URL を処理し、それらの「ルート」をコントローラー クラスのコントローラー アクションにマップする方法です。

「古典的な」ASP.NET Webforms のやり方から大きく離れています。

于 2009-11-18T22:06:19.700 に答える
0

Apache を使用していて、単純に静的 HTML ファイルのファイル拡張子を非表示にしたい場合は、次の.htaccessコードを使用できます。

<IfModule mod_rewrite.c>
RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f       # if the requested URL is not a file that exists
RewriteCond %{REQUEST_FILENAME} !-d       # and it isn't a directory that exists either
RewriteCond %{REQUEST_FILENAME}\.html -f  # but when you put ".html" on the end it is a file that exists
RewriteRule ^(.+)$ $1\.html [QSA]         # then serve that file

</IfModule>

Apachemod_rewriteは「ブードゥーだが、マジでクールなブードゥー」と呼ばれてきた。

.htaccess私がいくつかのサイトで使用している実際のコードはそのようなものですが、同一ではありません。

<IfModule mod_rewrite.c>
    RewriteEngine on

    #RewriteRule ^$ index.php [QSA]
    RewriteCond %{REQUEST_FILENAME}\.php -f
    RewriteRule ^(.+)$ $1\.php [QSA]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.+)$ index.php/$1 [QSA]

</IfModule>

そして、Zeus サーバーで同じことを行うための、はるかに長いがはるかに読みやすいコードがいくつかあります。Zeus では、 と呼ばれrewrite.scriptます。

# http://drupal.org/node/46508


# get the document root
map path into SCRATCH:DOCROOT from /
# initialize our variables
set SCRATCH:ORIG_URL = %{URL}
set SCRATCH:REQUEST_URI = %{URL}

match URL into $ with ^(.*)\?(.*)$
if matched then
  set SCRATCH:REQUEST_URI = $1
  set SCRATCH:QUERY_STRING = $2
endif

# prepare to search for file, rewrite if its not found
set SCRATCH:REQUEST_FILENAME = %{SCRATCH:DOCROOT}
set SCRATCH:REQUEST_FILENAME . %{SCRATCH:REQUEST_URI}

# check to see if the file requested is an actual file or
# a directory with possibly an index.  don't rewrite if so
look for file at %{SCRATCH:REQUEST_FILENAME}
if not exists then
  look for dir at %{SCRATCH:REQUEST_FILENAME}
  if not exists then
    look for file at  %{SCRATCH:REQUEST_FILENAME}.php
    if exists then
        set URL = %{SCRATCH:REQUEST_URI}.php?%{SCRATCH:QUERY_STRING}
    else
        set URL = /index.php/%{SCRATCH:REQUEST_URI}?%{SCRATCH:QUERY_STRING}
    endif
  endif
endif
goto END
于 2009-11-19T01:50:38.643 に答える
0

最新の Web 開発フレームワークは、エレガントな URL をサポートしています。DjangoまたはRuby on Rails を調べてください。

于 2009-11-19T00:04:37.333 に答える
0

Apache+PHP でこれを行う方法はいくつかありますが、本質的な原則は、URI のセットを作成することです (サイトによっては、おそらくすべての URI ですが、サイトのさまざまな部分を処理するためにさまざまなスクリプトが必要になる場合があります)。ユーザーが要求したオブジェクトが通知された単一の PHP ファイルに変換されます。

概念的に最も単純な方法は、すべての URL をスクリプトに書き換えて、URI を取得し、$_SERVER['REQUEST_URI']好きなように解釈することです。

URI の書き換えは、mod_rewrite、mod_alias、ErrorDocument などのさまざまな方法で実行できます (Apache ドキュメントを参照)。

もう 1 つの方法は、より複雑な URL 書き換えを (おそらく mod_rewrite を使用して) セットアップし、パスを GET 変数として追加することです。

パスの存在しない部分$_SERVER['PATH_INFO']がロードされる変数もあります。このオプションでは、Apache 構成ファイルをほとんどまたはまったく変更する必要はありませんが、URL の柔軟性が少し低下します。

于 2009-11-18T22:10:34.187 に答える