使用mod_rewrite如何从网址获取最后3位数字

时间:2011-02-23 18:41:56

标签: apache mod-rewrite

我需要从随机网址中获取最后一组数字,网址如下:

/目录/ directory2 / A-B-C-d-123

a,b,c,d等..可以是任何东西,数字,字母,但总是会有破折号

我们正在为这个项目使用kohana,所以还有一些额外的重写规则,但这是我到目前为止...

# Turn on URL rewriting
RewriteEngine On

# Installation directory
RewriteBase /site/

# Protect hidden files from being viewed
<Files .*>
    Order Deny,Allow
    Deny From All
</Files>

# Protect application and system files from being viewed
RewriteRule ^(?:application|modules|system)\b - [F,L]

#My Code Attempts Here
RewriteCond %{REQUEST_URI} dealership/Listing/                 
RewriteRule ([0-9]*)$ index.php/dealership/Listing/$1     

# Allow any files or directories that exist to be displayed directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# Rewrite all other URLs to index.php/URL
RewriteRule .* index.php/$0 [PT]

我已经尝试了几十个配置,设置和研究Google几个小时没有具体答案。

我已经能够自己获取123,但从未将目录仍然附加,当我尝试了一些配置时,我最终会在无限循环中得到一个apache错误。

最终结果是/ directory / directory2 / 123

谢谢!

1 个答案:

答案 0 :(得分:0)

你的规则

RewriteRule ([0-9]*)$ index.php/listing/$1

没用,因为它不会更改REQUEST_URI,因此PHP不会看到重写的index.php/listing/123,它会看到原始的/listing/foo-123。如果您添加[L]标记,它将进入循环,因为相应的ReqeuestCond将继续为真。

通常,您会将URL位作为参数传递给脚本,例如

RewriteRule ([0-9]*)$ index.php?listing=$1 [L]

但是,在这种形式下它不起作用,因为([0-9]*)$匹配任何路径末尾的空字符串,因此它将导致两次重写:

listing/foo-(123) → index.php?listing=123  # this is what you want ...
index.php()       → index.php?listing=     # ... but it gets rewritten
index.php()       → index.php?listing=     # no change so this is final

这是因为所有重写规则都是在每次重写后从头开始计算的(无论[L]标志如何)。

因此,您需要一个更具体的规则

RewriteRule ^listing/[^/]*-([0-9]*)$ index.php?listing=$1 [L]

这可以单独使用,但它会与您的最终规则进行交互,因此在其上添加一个条件以防止它循环

RewriteCond $0 !^/index.php($|/)  # $0 is what the RewriteRule matched
RewriteRule .* index.php/$0 [L]