簡體   English   中英

.htaccess中項目的Mod_rewrite規則

[英]Mod_rewrite rules for project in .htaccess

我在執行的PHP網站中使用mod_rewrite規則遇到麻煩。

我使用的是Apache 2.4.9(Unix)-Mac OSX Yosemite隨附的apache。

我在項目的根目錄中有.htaccess文件,並且將其設置為在虛擬主機中運行...因此,我要從中訪問項目的地址是http://project.local 這是我在.htaccess

RewriteEngine On

# Don't rewrite files
RewriteCond %{REQUEST_FILENAME} !-f
# Don't rewrite directories
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^pages pages.php [NC]
RewriteRule ^page/([0-9a-zA-Z]+) page.php?var=$1 [QSA]

這是我的虛擬主機設置:

<VirtualHost *:80>
    ServerAdmin me@me.com
    DocumentRoot "/Users/Me/Sites/project"
    ServerName project.local
    ServerAlias project.local
    ErrorLog "/Users/Me/Sites/logs/project_error_log"
</VirtualHost>

這是我在page.phppage.php

<?php
echo "Hello " . $_GET['var'];
?>

我可以成功訪問http://project.local/pages ,它顯示了上述規則中pages.php的內容。 但是當我轉到http://project.local/page/testpage ,它顯示的是Hello而不是$_GET['var'] 我究竟做錯了什么?

通過將以下代碼放在您的.htaccess中,可以禁用MultiViews選項:

Options -MultiViews
RewriteEngine On

# Don't rewrite files
RewriteCond %{REQUEST_FILENAME} !-f
# Don't rewrite directories
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^pages pages.php [NC,L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^page/([0-9a-zA-Z]+)/?$ page.php?var=$1 [QSA,L,NC]

Apache's content negotiation module使用Option MultiViews ,該Apache's content negotiation module mod_rewrite 之前運行,並使Apache服務器匹配文件擴展名。 因此/file可以位於URL中,但它將提供/file.php

我通過在.htaccess文件中添加以下行來解決此問題。

Options FollowSymLinks

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM