mod重写从url中删除文件名

时间:2017-01-02 13:39:26

标签: php apache .htaccess mod-rewrite url-rewriting

如果我有文件,请说rec-view.php,然后我可以通过此网址拨打电话:

domain.com/record/rec-view.php?id=3

但是,我想用以下URL调用此文件:

domain.com/record/3

所以,基本上我想告诉服务器,如果有任何文件以" -view.php "结尾? name,然后它应该在URL中一起删除文件名,并仅通过传递id打开该文件。

我正在尝试以下规则,它通过" / v"访问该文件。但我需要通过动态数字进行访问。

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

2 个答案:

答案 0 :(得分:1)

尝试:

RewriteEngine on
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
RewriteRule ^(.*)/(.*) $1-view.php?id=$2 [L]

答案 1 :(得分:1)

试试这个:

Options +FollowSymLinks

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteBase /

    # Match the host, if you wish
    #RewriteCond %{HTTP_HOST} ^domain\.com$

    RewriteRule record/(\d) /record/rec-view.php?id=$1 [NC,L]
</IfModule>

如果您愿意,可以test it online

enter image description here

(\d)只与数字值匹配,如果您希望接受任何值,可以将其更改为(.*)

刚看到你需要一个更通用的规则:

# Maps record/4 to record/record-view.php?id=4
RewriteRule (.*)/(\d) /$1/$1-view.php?id=$2 [NC,L]

为此,您需要更严格的命名约定。更具体地说,您需要将所有这些*-view.php文件命名为与其包含目录完全相同。

除非它始终是前3个字符,否则无法凭空获得rec前缀;是吗?

更新

根据您的评论,这是一个更通用的规则集,用于检查URI的最后一个段是否为数字,如果是,则将请求映射到包含目录的*-view.php文件,同时保持目录结构并附加?id=*查询字符串:

# This rule maps this:
#     domain.com/foo/bar/baz/4 
# to: 
#     domain.com/foo/bar/baz/baz-view.php?id=4
RewriteRule ^(.*)/(.*)/(\d)$ /$1/$2/$2-view.php?id=$3 [L,R]

您可能还需要其他变体:

# This rule maps this:
#     domain.com/foo/bar/baz/4 
# to: 
#     domain.com/foo/bar/baz-view.php?id=4
#
# Notice the baz/ segment dropped.
RewriteRule ^(.*)/(.*)/(\d)$ /$1/$2-view.php?id=$3 [L,R]

# This rule maps this:
#     domain.com/foo/bar/baz/4 
# to: 
#     domain.com/baz-view.php?id=4
#
# Notice all the segments dropped. Mapping to 
# a php file in the root directory. 
RewriteRule ^(.*)/(.*)/(\d)$ /$2-view.php?id=$3 [L,R]