0

だから私はmod_rewriteにいくつかの異なることをさせようとしていますが、私はそれを完全に理解していません。そうしたいです:

  1. URL(この場合は.shtml)からファイル拡張子を削除します
  2. 次のように特定のURLを書き直します。

    /dashboard       -> /ui/dashboard/index.shtml
    /dashboard/      -> /ui/dashboard/index.shtml
    /dashboard/list  -> /ui/dashboard/list.shtml
    /dashboard/list/ -> /ui/dashboard/list.shtml
    /workspace       -> /ui/workspace/index.shtml
    /workspace/      -> /ui/workspace/index.shtml
    /account/manage  -> /ui/account/manage.shtml
    /account/manage/ -> /ui/account/manage.shtml
    
  3. 末尾のスラッシュを追加または削除します(一貫している限り、どちらでも構いません)

私が現在持っているものは、そこまでの道のりの約90%を私にもたらします。私の.htaccessファイルには、次のものがあります。

DirectoryIndex index.shtml index.html index.htm

<IfModule mod_rewrite.c>

  Options +FollowSymlinks
  RewriteEngine On
  RewriteBase /

  # Get rid of the /ui/ in the URLs
  RewriteRule ^(account|workspace|dashboard)([a-zA-Z0-9\-_\.\/]+)?$ /ui/$1$2 [NC,L]

  # Add the trailing slash
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/|#(.*))$
  RewriteRule ^(.*)$ $1/ [R=301,L]

  # Remove the shtml extension
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME}.shtml -f
  RewriteRule ^([^\.]+)/$ $1\.shtml

</IfModule>

今私が遭遇している問題は2つあります:

まず、上記の手順2でリストされたディレクトリに概説されているインデックスページの1つにアクセスしようとすると、末尾のスラッシュを使用する限り問題ありませんが、末尾のスラッシュを省略すると、URLが正しく書き換えられません(ただし、ページは引き続き読み込まれます)。例えば

/dashboard/   remains /dashboard/ in the address bar.
/dashboard    rewrites to /ui/dashboard/ in the address bar.

これらのindex.shtmlページを取得して、アドレスバーの一貫性を保つにはどうすればよいですか?

次に、書き換えられたディレクトリの1つにあるディレクトリインデックス以外のページにアクセスしようとし、末尾にスラッシュを含めると、404エラーが発生します。例えば:

/dashboard/list/

404エラーをスローします:

The requested URL /ui/dashboard/list.shtml/ was not found on this server.

あなたが提供できるこれを適切に機能させるためのどんな助けも大いに感謝されます。

4

1 に答える 1

2

だから私は私が必要とするもののために働くアプローチを考え出しました。これが私が思いついた.htaccessで、インラインでコメントされています。

# Match URLs that aren't a file
RewriteCond %{REQUEST_FILENAME} !-f

# nor a directory
RewriteCond %{REQUEST_FILENAME} !-d

# if it's the index page of the directory we want, show that and go no further
RewriteRule ^(account|workspace|dashboard)/?$ /ui/$1/index.shtml [L]

# If we've gotten here, we're dealing with something other than the directory index.
# Let's remove the trailing slash internally
# This takes care of my second issue in my original question
RewriteRule ^(.*)/$ $1 [L]

# Do the rewrite for the the non-directory-index files. 
RewriteRule ^(account|workspace|dashboard)([a-zA-Z0-9\-_\.\/]+)?$ /ui/$1$2 [L]

これがこれを行うための最も効率的な方法であるかどうかはわかりませんが、私のニーズには合っています。それが他の誰かを助ける場合に備えて、ここでそれを共有したいと思いました。

于 2012-05-24T22:00:13.660 に答える