まず、これを .htaccess で行っている場合、mod_rewrite は処理を停止せず、代わりに内部リダイレクトを行います。詳細については、この回答を参照してください。
2 番目の書き換えルールでピリオドをエスケープする必要があります。ピリオド (またはドット) は、エスケープされていない場合、任意の文字と一致します。
固定ルール:
RewriteRule ^/([a-zA-Z0-9\._-]+)$ /index.php?user=$1 [L]
編集3:
コメントと独自の回答に基づいて、更新されたソリューションを次に示します。Apacheでの動作方法は、現在のコンテキストによって異なります。一致するパターンから をRewriteCond %{REQUEST_FILENAME}
省略することもできます。?
RewriteRule ^/help$ /index.php?page=help [L]
# If you are inside <VirtualHost> context
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d
RewriteRule ^/([a-zA-Z0-9\._-]+)$ /index.php?user=$1 [L]
# If you are inside <Directory> or .htaccesscontext
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/([a-zA-Z0-9\._-]+)$ /index.php?user=$1 [L]
サーバー上にあるファイルまたはディレクトリと同じ名前のユーザーがいる場合、このソリューションは競合を引き起こすことに注意してください。